ZGlmZiAtLWdpdCBhL2xpYm0vQW5kcm9pZC5tayBiL2xpYm0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBjM2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjExIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworbGlibV9jb21tb25fc3JjX2ZpbGVzOj0gXAorCWlzaW5mLmMgIFwKKwlmcGNsYXNzaWZ5LmMgXAorCWJzZHNyYy9iX2V4cC5jIFwKKwlic2RzcmMvYl9sb2cuYyBcCisJYnNkc3JjL2JfdGdhbW1hLmMgXAorCXNyYy9lX2Fjb3MuYyBcCisJc3JjL2VfYWNvc2YuYyBcCisJc3JjL2VfYWNvc2guYyBcCisJc3JjL2VfYWNvc2hmLmMgXAorCXNyYy9lX2FzaW4uYyBcCisJc3JjL2VfYXNpbmYuYyBcCisJc3JjL2VfYXRhbjIuYyBcCisJc3JjL2VfYXRhbjJmLmMgXAorCXNyYy9lX2F0YW5oLmMgXAorCXNyYy9lX2F0YW5oZi5jIFwKKwlzcmMvZV9jb3NoLmMgXAorCXNyYy9lX2Nvc2hmLmMgXAorCXNyYy9lX2V4cC5jIFwKKwlzcmMvZV9leHBmLmMgXAorCXNyYy9lX2Ztb2QuYyBcCisJc3JjL2VfZm1vZGYuYyBcCisJc3JjL2VfZ2FtbWEuYyBcCisJc3JjL2VfZ2FtbWFfci5jIFwKKwlzcmMvZV9nYW1tYWYuYyBcCisJc3JjL2VfZ2FtbWFmX3IuYyBcCisJc3JjL2VfaHlwb3QuYyBcCisJc3JjL2VfaHlwb3RmLmMgXAorCXNyYy9lX2owLmMgXAorCXNyYy9lX2owZi5jIFwKKwlzcmMvZV9qMS5jIFwKKwlzcmMvZV9qMWYuYyBcCisJc3JjL2Vfam4uYyBcCisJc3JjL2Vfam5mLmMgXAorCXNyYy9lX2xnYW1tYS5jIFwKKwlzcmMvZV9sZ2FtbWFfci5jIFwKKwlzcmMvZV9sZ2FtbWFmLmMgXAorCXNyYy9lX2xnYW1tYWZfci5jIFwKKwlzcmMvZV9sb2cuYyBcCisJc3JjL2VfbG9nMTAuYyBcCisJc3JjL2VfbG9nMTBmLmMgXAorCXNyYy9lX2xvZ2YuYyBcCisJc3JjL2VfcG93LmMgXAorCXNyYy9lX3Bvd2YuYyBcCisJc3JjL2VfcmVtX3BpbzIuYyBcCisJc3JjL2VfcmVtX3BpbzJmLmMgXAorCXNyYy9lX3JlbWFpbmRlci5jIFwKKwlzcmMvZV9yZW1haW5kZXJmLmMgXAorCXNyYy9lX3NjYWxiLmMgXAorCXNyYy9lX3NjYWxiZi5jIFwKKwlzcmMvZV9zaW5oLmMgXAorCXNyYy9lX3NpbmhmLmMgXAorCXNyYy9lX3NxcnQuYyBcCisJc3JjL2Vfc3FydGYuYyBcCisJc3JjL2tfY29zLmMgXAorCXNyYy9rX2Nvc2YuYyBcCisJc3JjL2tfcmVtX3BpbzIuYyBcCisJc3JjL2tfc2luLmMgXAorCXNyYy9rX3NpbmYuYyBcCisJc3JjL2tfdGFuLmMgXAorCXNyYy9rX3RhbmYuYyBcCisJc3JjL3NfYXNpbmguYyBcCisJc3JjL3NfYXNpbmhmLmMgXAorCXNyYy9zX2F0YW4uYyBcCisJc3JjL3NfYXRhbmYuYyBcCisJc3JjL3NfY2JydC5jIFwKKwlzcmMvc19jYnJ0Zi5jIFwKKwlzcmMvc19jZWlsLmMgXAorCXNyYy9zX2NlaWxmLmMgXAorCXNyYy9zX2NlaWxsLmMgXAorCXNyYy9zX2NvcHlzaWduLmMgXAorCXNyYy9zX2NvcHlzaWduZi5jIFwKKwlzcmMvc19jb3MuYyBcCisJc3JjL3NfY29zZi5jIFwKKwlzcmMvc19lcmYuYyBcCisJc3JjL3NfZXJmZi5jIFwKKwlzcmMvc19leHAyLmMgXAorCXNyYy9zX2V4cDJmLmMgXAorCXNyYy9zX2V4cG0xLmMgXAorCXNyYy9zX2V4cG0xZi5jIFwKKwlzcmMvc19mYWJzZi5jIFwKKwlzcmMvc19mZGltLmMgXAorCXNyYy9zX2Zpbml0ZS5jIFwKKwlzcmMvc19maW5pdGVmLmMgXAorCXNyYy9zX2Zsb29yLmMgXAorCXNyYy9zX2Zsb29yZi5jIFwKKwlzcmMvc19mbG9vcmwuYyBcCisJc3JjL3NfZm1hLmMgXAorCXNyYy9zX2ZtYWYuYyBcCisJc3JjL3NfZm1heC5jIFwKKwlzcmMvc19mbWF4Zi5jIFwKKwlzcmMvc19mbWF4bC5jIFwKKwlzcmMvc19mbWluLmMgXAorCXNyYy9zX2ZtaW5mLmMgXAorCXNyYy9zX2ZtaW5sLmMgXAorCXNyYy9zX2ZyZXhwZi5jIFwKKwlzcmMvc19pbG9nYi5jIFwKKwlzcmMvc19pbG9nYmYuYyBcCisJc3JjL3NfaWxvZ2JsLmMgXAorCXNyYy9zX2lzZmluaXRlLmMgXAorCXNyYy9zX2lzbm9ybWFsLmMgXAorCXNyYy9zX2xscmludC5jIFwKKwlzcmMvc19sbHJpbnRmLmMgXAorCXNyYy9zX2xscm91bmQuYyBcCisJc3JjL3NfbGxyb3VuZGYuYyBcCisJc3JjL3NfbGxyb3VuZGwuYyBcCisJc3JjL3NfbG9nMXAuYyBcCisJc3JjL3NfbG9nMXBmLmMgXAorCXNyYy9zX2xvZ2IuYyBcCisJc3JjL3NfbG9nYmYuYyBcCisJc3JjL3NfbHJpbnQuYyBcCisJc3JjL3NfbHJpbnRmLmMgXAorCXNyYy9zX2xyb3VuZC5jIFwKKwlzcmMvc19scm91bmRmLmMgXAorCXNyYy9zX2xyb3VuZGwuYyBcCisJc3JjL3NfbW9kZmYuYyBcCisJc3JjL3NfbmVhcmJ5aW50LmMgXAorCXNyYy9zX25leHRhZnRlci5jIFwKKwlzcmMvc19uZXh0YWZ0ZXJmLmMgXAorCXNyYy9zX25leHR0b3dhcmRmLmMgXAorCXNyYy9zX3JlbXF1by5jIFwKKwlzcmMvc19yZW1xdW9mLmMgXAorCXNyYy9zX3JpbnQuYyBcCisJc3JjL3NfcmludGYuYyBcCisJc3JjL3Nfcm91bmQuYyBcCisJc3JjL3Nfcm91bmRmLmMgXAorCXNyYy9zX3JvdW5kbC5jIFwKKwlzcmMvc19zaWduYml0LmMgXAorCXNyYy9zX3NpZ25nYW0uYyBcCisJc3JjL3Nfc2lnbmlmaWNhbmQuYyBcCisJc3JjL3Nfc2lnbmlmaWNhbmRmLmMgXAorCXNyYy9zX3Npbi5jIFwKKwlzcmMvc19zaW5mLmMgXAorCXNyYy9zX3Rhbi5jIFwKKwlzcmMvc190YW5mLmMgXAorCXNyYy9zX3RhbmguYyBcCisJc3JjL3NfdGFuaGYuYyBcCisJc3JjL3NfdHJ1bmMuYyBcCisJc3JjL3NfdHJ1bmNmLmMgXAorCXNyYy9zX3RydW5jbC5jIFwKKwlzcmMvd19kcmVtLmMgXAorCXNyYy93X2RyZW1mLmMgXAorCXNyYy9zX2NvcHlzaWdubC5jIFwKKwlzcmMvc19mYWJzbC5jIFwKKwlzcmMvc19mYWJzLmMgXAorCXNyYy9zX2ZyZXhwLmMgXAorCXNyYy9zX2lzbmFuLmMgXAorCXNyYy9zX21vZGYuYworCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgbGlibV9jb21tb25fc3JjX2ZpbGVzICs9IFwKKwlhcm0vZmVudi5jIFwKKwlzcmMvZV9sZGV4cGYuYyBcCisJc3JjL3Nfc2NhbGJsbi5jIFwKKwlzcmMvc19zY2FsYm4uYyBcCisJc3JjL3Nfc2NhbGJuZi5jCisKKyAgbGlibV9jb21tb25faW5jbHVkZXMgPSAkKExPQ0FMX1BBVEgpL2FybQorCitlbHNlCisgIGlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9BUkNIKSxsaW51eC14ODYpCisgICAgbGlibV9jb21tb25fc3JjX2ZpbGVzICs9IFwKKwlpMzg3L2ZlbnYuYyBcCisJaTM4Ny9zX3NjYWxibmwuUyBcCisJaTM4Ny9zX3NjYWxibi5TIFwKKwlpMzg3L3Nfc2NhbGJuZi5TCisKKyAgICBsaWJtX2NvbW1vbl9pbmNsdWRlcyA9ICQoTE9DQUxfUEFUSCkvaTM4NiAkKExPQ0FMX1BBVEgpL2kzODcKKyAgZWxzZQorICAgICQoZXJyb3IgIlVua25vd24gYXJjaGl0ZWN0dXJlIikKKyAgZW5kaWYKK2VuZGlmCisKKworIyBsaWJtLmEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChsaWJtX2NvbW1vbl9zcmNfZmlsZXMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGxpYm1fY29tbW9uX2luY2x1ZGVzKQorCitMT0NBTF9NT0RVTEU6PSBsaWJtCisKK0xPQ0FMX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIGxpYm0uc28KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChsaWJtX2NvbW1vbl9zcmNfZmlsZXMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9DX0lOQ0xVREVTICs9ICQobGlibV9jb21tb25faW5jbHVkZXMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYm0KKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJtL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbGlibS9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkaWZmIC0tZ2l0IGEvbGlibS9NYWtlZmlsZS1vcmlnIGIvbGlibS9NYWtlZmlsZS1vcmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZGQwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL01ha2VmaWxlLW9yaWcKQEAgLTAsMCArMSwxNTggQEAKKyMgIEAoIylNYWtlZmlsZSA1LjFiZXRhIDkzLzA5LzI0CisjICRGcmVlQlNEOiBzcmMvbGliL21zdW4vTWFrZWZpbGUsdiAxLjc0IDIwMDUvMTEvMDYgMTc6NTk6NDAgYmRlIEV4cCAkCisjCisjICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworIyAgc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyMgIGlzIHByZXNlcnZlZC4KKyMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMKKworLmlmICR7TUFDSElORV9BUkNIfSA9PSAiaTM4NiIKK0FSQ0hfU1VCRElSPSBpMzg3CisuZWxzZQorQVJDSF9TVUJESVI9ICR7TUFDSElORV9BUkNIfQorLmVuZGlmCisKKy5pbmNsdWRlICIke0FSQ0hfU1VCRElSfS9NYWtlZmlsZS5pbmMiCisKKy5QQVRIOgkkey5DVVJESVJ9L2JzZHNyYworLlBBVEg6CSR7LkNVUkRJUn0vbWFuCisuUEFUSDoJJHsuQ1VSRElSfS9zcmMKKworTElCPQltCitTSExJQkRJUj89IC9saWIKK1NITElCX01BSk9SPSA0CitDT01NT05fU1JDUz0gYl9leHAuYyBiX2xvZy5jIGJfdGdhbW1hLmMgXAorCWVfYWNvcy5jIGVfYWNvc2YuYyBlX2Fjb3NoLmMgZV9hY29zaGYuYyBlX2FzaW4uYyBlX2FzaW5mLmMgXAorCWVfYXRhbjIuYyBlX2F0YW4yZi5jIGVfYXRhbmguYyBlX2F0YW5oZi5jIGVfY29zaC5jIGVfY29zaGYuYyBlX2V4cC5jIFwKKwllX2V4cGYuYyBlX2Ztb2QuYyBlX2Ztb2RmLmMgZV9nYW1tYS5jIGVfZ2FtbWFfci5jIGVfZ2FtbWFmLmMgXAorCWVfZ2FtbWFmX3IuYyBlX2h5cG90LmMgZV9oeXBvdGYuYyBlX2owLmMgZV9qMGYuYyBlX2oxLmMgZV9qMWYuYyBcCisJZV9qbi5jIGVfam5mLmMgZV9sZ2FtbWEuYyBlX2xnYW1tYV9yLmMgZV9sZ2FtbWFmLmMgZV9sZ2FtbWFmX3IuYyBcCisJZV9sb2cuYyBlX2xvZzEwLmMgZV9sb2cxMGYuYyBlX2xvZ2YuYyBlX3Bvdy5jIGVfcG93Zi5jIGVfcmVtX3BpbzIuYyBcCisJZV9yZW1fcGlvMmYuYyBlX3JlbWFpbmRlci5jIGVfcmVtYWluZGVyZi5jIGVfc2NhbGIuYyBlX3NjYWxiZi5jIFwKKwllX3NpbmguYyBlX3NpbmhmLmMgZV9zcXJ0LmMgZV9zcXJ0Zi5jIGZlbnYuYyBcCisJa19jb3MuYyBrX2Nvc2YuYyBrX3JlbV9waW8yLmMga19zaW4uYyBrX3NpbmYuYyBcCisJa190YW4uYyBrX3RhbmYuYyBcCisJc19hc2luaC5jIHNfYXNpbmhmLmMgc19hdGFuLmMgc19hdGFuZi5jIHNfY2JydC5jIHNfY2JydGYuYyBcCisJc19jZWlsLmMgc19jZWlsZi5jIHNfY2VpbGwuYyBcCisJc19jb3B5c2lnbi5jIHNfY29weXNpZ25mLmMgc19jb3MuYyBzX2Nvc2YuYyBzX2VyZi5jIHNfZXJmZi5jIFwKKwlzX2V4cDIuYyBzX2V4cDJmLmMgc19leHBtMS5jIHNfZXhwbTFmLmMgc19mYWJzZi5jIHNfZmRpbS5jIFwKKwlzX2Zpbml0ZS5jIHNfZmluaXRlZi5jIFwKKwlzX2Zsb29yLmMgc19mbG9vcmYuYyBzX2Zsb29ybC5jIHNfZm1hLmMgc19mbWFmLmMgXAorCXNfZm1heC5jIHNfZm1heGYuYyBzX2ZtYXhsLmMgc19mbWluLmMgXAorCXNfZm1pbmYuYyBzX2ZtaW5sLmMgc19mcmV4cC5jIHNfZnJleHBmLmMgc19pbG9nYi5jIHNfaWxvZ2JmLmMgXAorCXNfaWxvZ2JsLmMgc19pc2Zpbml0ZS5jIHNfaXNuYW4uYyBzX2lzbm9ybWFsLmMgXAorCXNfbGxyaW50LmMgc19sbHJpbnRmLmMgc19sbHJvdW5kLmMgc19sbHJvdW5kZi5jIHNfbGxyb3VuZGwuYyBcCisJc19sb2cxcC5jIHNfbG9nMXBmLmMgc19sb2diLmMgc19sb2diZi5jIHNfbHJpbnQuYyBzX2xyaW50Zi5jIFwKKwlzX2xyb3VuZC5jIHNfbHJvdW5kZi5jIHNfbHJvdW5kbC5jIHNfbW9kZmYuYyBcCisJc19uZWFyYnlpbnQuYyBzX25leHRhZnRlci5jIHNfbmV4dGFmdGVyZi5jIFwKKwlzX25leHR0b3dhcmRmLmMgc19yZW1xdW8uYyBzX3JlbXF1b2YuYyBcCisJc19yaW50LmMgc19yaW50Zi5jIHNfcm91bmQuYyBzX3JvdW5kZi5jIHNfcm91bmRsLmMgXAorCXNfc2NhbGJsbi5jIHNfc2NhbGJuLmMgc19zY2FsYm5mLmMgc19zaWduYml0LmMgXAorCXNfc2lnbmdhbS5jIHNfc2lnbmlmaWNhbmQuYyBzX3NpZ25pZmljYW5kZi5jIHNfc2luLmMgc19zaW5mLmMgc190YW4uYyBcCisJc190YW5mLmMgc190YW5oLmMgc190YW5oZi5jIHNfdHJ1bmMuYyBzX3RydW5jZi5jIHNfdHJ1bmNsLmMgXAorCXdfY2Ficy5jIHdfY2Fic2YuYyB3X2RyZW0uYyB3X2RyZW1mLmMKKworIyBMb2NhdGlvbiBvZiBmcG1hdGguaCBhbmQgX2ZwbWF0aC5oCitMSUJDRElSPQkkey5DVVJESVJ9Ly4uL2xpYmMKK0NGTEFHUys9CS1JJHtMSUJDRElSfS9pbmNsdWRlIC1JJHtMSUJDRElSfS8ke01BQ0hJTkVfQVJDSH0KKworIyBDOTkgbG9uZyBkb3VibGUgZnVuY3Rpb25zCitDT01NT05fU1JDUys9CXNfY29weXNpZ25sLmMgc19mYWJzbC5jCisuaWYgJHtMREJMX1BSRUN9ICE9IDUzCisjIElmIGxvbmcgZG91YmxlICE9IGRvdWJsZSB1c2UgdGhlc2U7IG90aGVyd2lzZSwgd2UgYWxpYXMgdGhlIGRvdWJsZSB2ZXJzaW9ucy4KK0NPTU1PTl9TUkNTKz0Jc19mbWFsLmMgc19mcmV4cGwuYyBzX25leHRhZnRlcmwuYyBzX25leHR0b3dhcmQuYyBzX3NjYWxibmwuYworLmVuZGlmCisKKyMgQzk5IGNvbXBsZXggZnVuY3Rpb25zCitDT01NT05fU1JDUys9CXNfY2ltYWcuYyBzX2NpbWFnZi5jIHNfY2ltYWdsLmMgc19jb25qLmMgc19jb25qZi5jIHNfY29uamwuYyBcCisJc19jcmVhbC5jIHNfY3JlYWxmLmMgc19jcmVhbGwuYworCisjIEZyZWVCU0QncyBDIGxpYnJhcnkgc3VwcGxpZXMgdGhlc2UgZnVuY3Rpb25zOgorI0NPTU1PTl9TUkNTKz0Jc19mYWJzLmMgc19mcmV4cC5jIHNfaXNuYW4uYyBzX2xkZXhwLmMgc19tb2RmLmMKKworIyBFeGNsdWRlIHRoZSBnZW5lcmljIHZlcnNpb25zIG9mIHdoYXQgd2UgcHJvdmlkZSBpbiB0aGUgTUQgYXJlYS4KKy5QQVRIOgkkey5DVVJESVJ9LyR7QVJDSF9TVUJESVJ9CisuaWYgZGVmaW5lZChBUkNIX1NSQ1MpCisuZm9yIGkgaW4gJHtBUkNIX1NSQ1N9CitDT01NT05fU1JDUzo9ICAke0NPTU1PTl9TUkNTOk4ke2k6Un0uY30KKy5lbmRmb3IKKy5lbmRpZgorCitTUkNTPQkke0NPTU1PTl9TUkNTfSAke0FSQ0hfU1JDU30KKworSU5DUz0JZmVudi5oIG1hdGguaAorCitNQU49CWFjb3MuMyBhY29zaC4zIGFzaW4uMyBhc2luaC4zIGF0YW4uMyBhdGFuMi4zIGF0YW5oLjMgY2VpbC4zIFwKKwljaW1hZy4zIGNvcHlzaWduLjMgY29zLjMgY29zaC4zIGVyZi4zIGV4cC4zIGZhYnMuMyBmZGltLjMgXAorCWZlY2xlYXJleGNlcHQuMyBmZWVuYWJsZWV4Y2VwdC4zIGZlZ2V0ZW52LjMgXAorCWZlZ2V0cm91bmQuMyBmZW52LjMgZmxvb3IuMyBcCisJZm1hLjMgZm1heC4zIGZtb2QuMyBoeXBvdC4zIGllZWUuMyBpZWVlX3Rlc3QuMyBpbG9nYi4zIGowLjMgXAorCWxnYW1tYS4zIGxyaW50LjMgbHJvdW5kLjMgbWF0aC4zIG5leHRhZnRlci4zIHJlbWFpbmRlci4zIHJpbnQuMyBcCisJcm91bmQuMyBzY2FsYm4uMyBzaWduYml0LjMgc2luLjMgc2luaC4zIHNxcnQuMyB0YW4uMyB0YW5oLjMgdHJ1bmMuMworCitNTElOS1MrPWFjb3MuMyBhY29zZi4zCitNTElOS1MrPWFjb3NoLjMgYWNvc2hmLjMKK01MSU5LUys9YXNpbi4zIGFzaW5mLjMKK01MSU5LUys9YXNpbmguMyBhc2luaGYuMworTUxJTktTKz1hdGFuLjMgYXRhbmYuMworTUxJTktTKz1hdGFuaC4zIGF0YW5oZi4zCitNTElOS1MrPWF0YW4yLjMgYXRhbjJmLjMKK01MSU5LUys9Y2VpbC4zIGNlaWxmLjMgY2VpbC4zIGNlaWxsLjMKK01MSU5LUys9Y2ltYWcuMyBjaW1hZ2YuMyBjaW1hZy4zIGNpbWFnbC4zIFwKKwljaW1hZy4zIGNvbmouMyBjaW1hZy4zIGNvbmpmLjMgY2ltYWcuMyBjb25qbC4zIFwKKwljaW1hZy4zIGNyZWFsLjMgY2ltYWcuMyBjcmVhbGYuMyBjaW1hZy4zIGNyZWFsbC4zCitNTElOS1MrPWNvcHlzaWduLjMgY29weXNpZ25mLjMgY29weXNpZ24uMyBjb3B5c2lnbmwuMworTUxJTktTKz1jb3MuMyBjb3NmLjMKK01MSU5LUys9Y29zaC4zIGNvc2hmLjMKK01MSU5LUys9ZXJmLjMgZXJmYy4zIGVyZi4zIGVyZmYuMyBlcmYuMyBlcmZjZi4zCitNTElOS1MrPWV4cC4zIGV4cG0xLjMgZXhwLjMgbG9nLjMgZXhwLjMgbG9nMTAuMyBleHAuMyBsb2cxcC4zIGV4cC4zIHBvdy4zIFwKKwlleHAuMyBleHAyLjMgZXhwLjMgZXhwMmYuMyBleHAuMyBleHBmLjMgXAorCWV4cC4zIGV4cG0xZi4zIGV4cC4zIGxvZ2YuMyBleHAuMyBwb3dmLjMgXAorCWV4cC4zIGxvZzEwZi4zIGV4cC4zIGxvZzFwZi4zCitNTElOS1MrPWZhYnMuMyBmYWJzZi4zIGZhYnMuMyBmYWJzbC4zCitNTElOS1MrPWZkaW0uMyBmZGltZi4zIGZkaW0uMyBmZGltbC4zCitNTElOS1MrPWZlY2xlYXJleGNlcHQuMyBmZWdldGV4Y2VwdGZsYWcuMyBmZWNsZWFyZXhjZXB0LjMgZmVyYWlzZWV4Y2VwdC4zIFwKKwlmZWNsZWFyZXhjZXB0LjMgZmVzZXRleGNlcHRmbGFnLjMgZmVjbGVhcmV4Y2VwdC4zIGZldGVzdGV4Y2VwdC4zCitNTElOS1MrPWZlZW5hYmxlZXhjZXB0LjMgZmVkaXNhYmxlZXhjZXB0LjMgZmVlbmFibGVleGNlcHQuMyBmZWdldGV4Y2VwdC4zCitNTElOS1MrPWZlZ2V0ZW52LjMgZmVob2xkZXhjZXB0LjMgZmVnZXRlbnYuMyBmZXNldGVudi4zIFwKKwlmZWdldGVudi4zIGZldXBkYXRlZW52LjMKK01MSU5LUys9ZmVnZXRyb3VuZC4zIGZlc2V0cm91bmQuMworTUxJTktTKz1mbG9vci4zIGZsb29yZi4zIGZsb29yLjMgZmxvb3JsLjMKK01MSU5LUys9Zm1hLjMgZm1hZi4zIGZtYS4zIGZtYWwuMworTUxJTktTKz1mbWF4LjMgZm1heGYuMyBmbWF4LjMgZm1heGwuMyBcCisJZm1heC4zIGZtaW4uMyBmbWF4LjMgZm1pbmYuMyBmbWF4LjMgZm1pbmwuMworTUxJTktTKz1mbW9kLjMgZm1vZGYuMworTUxJTktTKz1oeXBvdC4zIGNhYnMuMyBoeXBvdC4zIGNhYnNmLjMgaHlwb3QuMyBoeXBvdGYuMworTUxJTktTKz1pZWVlX3Rlc3QuMyBzY2FsYi4zIGllZWVfdGVzdC4zIHNjYWxiZi4zCitNTElOS1MrPWllZWVfdGVzdC4zIHNpZ25pZmljYW5kLjMgaWVlZV90ZXN0LjMgc2lnbmlmaWNhbmRmLjMKK01MSU5LUys9aWxvZ2IuMyBpbG9nYmYuMyBpbG9nYi4zIGlsb2dibC4zIFwKKwlpbG9nYi4zIGxvZ2IuMyBpbG9nYi4zIGxvZ2JmLjMKK01MSU5LUys9ajAuMyBqMS4zIGowLjMgam4uMyBqMC4zIHkwLjMgajAuMyB5MS4zIGowLjMgeTFmLjMgajAuMyB5bi4zCitNTElOS1MrPWowLjMgajBmLjMgajAuMyBqMWYuMyBqMC4zIGpuZi4zIGowLjMgeTBmLjMgajAuMyB5bmYuMworTUxJTktTKz1sZ2FtbWEuMyBnYW1tYS4zIGxnYW1tYS4zIGdhbW1hZi4zIGxnYW1tYS4zIGxnYW1tYWYuMyBsZ2FtbWEuMyB0Z2FtbWEuMworTUxJTktTKz1scmludC4zIGxscmludC4zIGxyaW50LjMgbGxyaW50Zi4zIGxyaW50LjMgbHJpbnRmLjMKK01MSU5LUys9bHJvdW5kLjMgbGxyb3VuZC4zIGxyb3VuZC4zIGxscm91bmRmLjMgbHJvdW5kLjMgbGxyb3VuZGwuMyBcCisJbHJvdW5kLjMgbHJvdW5kZi4zIGxyb3VuZC4zIGxyb3VuZGwuMworTUxJTktTKz1uZXh0YWZ0ZXIuMyBuZXh0YWZ0ZXJmLjMgbmV4dGFmdGVyLjMgbmV4dGFmdGVybC4zCitNTElOS1MrPW5leHRhZnRlci4zIG5leHR0b3dhcmQuMyBuZXh0YWZ0ZXIuMyBuZXh0dG93YXJkZi4zCitNTElOS1MrPW5leHRhZnRlci4zIG5leHR0b3dhcmRsLjMKK01MSU5LUys9cmVtYWluZGVyLjMgcmVtYWluZGVyZi4zCitNTElOS1MrPXJlbWFpbmRlci4zIHJlbXF1by4zIHJlbWFpbmRlci4zIHJlbXF1b2YuMworTUxJTktTKz1yaW50LjMgcmludGYuMyByaW50LjMgbmVhcmJ5aW50LjMgcmludC4zIG5lYXJieWludGYuMworTUxJTktTKz1yb3VuZC4zIHJvdW5kZi4zIHJvdW5kLjMgcm91bmRsLjMKK01MSU5LUys9c2NhbGJuLjMgc2NhbGJsbi4zIHNjYWxibi4zIHNjYWxibG5mLjMgc2NhbGJuLjMgc2NhbGJsbmwuMworTUxJTktTKz1zY2FsYm4uMyBzY2FsYm5mLjMgc2NhbGJuLjMgc2NhbGJubC4zCitNTElOS1MrPXNpbi4zIHNpbmYuMworTUxJTktTKz1zaW5oLjMgc2luaGYuMworTUxJTktTKz1zcXJ0LjMgY2JydC4zIHNxcnQuMyBjYnJ0Zi4zIHNxcnQuMyBzcXJ0Zi4zCitNTElOS1MrPXRhbi4zIHRhbmYuMworTUxJTktTKz10YW5oLjMgdGFuaGYuMworTUxJTktTKz10cnVuYy4zIHRydW5jZi4zIHRydW5jLjMgdHJ1bmNsLjMKKworLmluY2x1ZGUgPGJzZC5saWIubWs+CmRpZmYgLS1naXQgYS9saWJtL05PVElDRSBiL2xpYm0vTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDE3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL05PVElDRQpAQCAtMCwwICsxLDM1NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQ29weXJpZ2h0IChjKSAyMDAzIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBEYWctRXJsaW5nIENv72RhbiBTbfhyZ3JhdgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgIGluIHRoaXMgcG9zaXRpb24gYW5kIHVuY2hhbmdlZC4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk2IFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgorICogYnkgSi5ULiBDb25rbGluLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECisgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MworICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Myw5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorLlwiIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorCisuXCIgQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKworLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKwpkaWZmIC0tZ2l0IGEvbGlibS9hbHBoYS9NYWtlZmlsZS5pbmMgYi9saWJtL2FscGhhL01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzVhY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbHBoYS9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSwxMCBAQAorIyAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FscGhhL01ha2VmaWxlLmluYyx2IDEuMiAyMDA1LzAzLzA3IDA0OjUzOjM1IGRhcyBFeHAgJAorCitBUkNIX1NSQ1MgPSBzX2NvcHlzaWduLlMgc19jb3B5c2lnbmYuUworTERCTF9QUkVDID0gNTMKKworIyBYWFggQ29tbWVudCBmcm9tIE5ldEJTRC9BbHBoYToKKyMgWFhYIExJTlQgU0lHRlBFcyBpbiBlX2V4cC5jJ3Mgc3RydG9kKCkuICBGUCB1bmRlcmZsb3cvZGVub3JtIHNvZnR3YXJlCisjIGhhbmRsaW5nIGlzIGJyb2tlbiAoZG9lc24ndCBleGlzdCEpIG9uIHRoZSBBbHBoYSBwb3J0LgorIyBTdG9jayBnY2MgMi43LjIuMSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlc2Ugb3B0aW9ucy4KKyNDRkxBR1MgKz0gLW10cmFwLXByZWNpc2lvbj1pIC1tZnAtdHJhcC1tb2RlPXN1CmRpZmYgLS1naXQgYS9saWJtL2FscGhhL19mcG1hdGguaCBiL2xpYm0vYWxwaGEvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTIzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FscGhhL19mcG1hdGguaApAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvYWxwaGEvX2ZwbWF0aC5oLHYgMS42IDIwMDUvMDMvMDcgMDQ6NTU6MjEgZGFzIEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisJCXVuc2lnbmVkIGludAltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTE7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworCX0gYml0czsKK307CisKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh2b2lkKTApCisjZGVmaW5lCUxEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlMREJMX05CSVQJMAorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTIwCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL2FscGhhL2ZlbnYuYyBiL2xpYm0vYWxwaGEvZmVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWIyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FscGhhL2ZlbnYuYwpAQCAtMCwwICsxLDE0NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYWxwaGEvZmVudi5jLHYgMS4yIDIwMDUvMDMvMTYgMTk6MDM6NDQgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvc3lzYXJjaC5oPgorI2luY2x1ZGUgPGZlbnYuaD4KKworY29uc3QgZmVudl90IF9fZmVfZGZsX2VudiA9IDB4NjgwZTAwMDAwMDAwMDAwMFVMTDsKKworc3RydWN0IG1hc2tfYXJncyB7CisJZmVudl90IG1hc2s7Cit9OworCisvKgorICogVGhlIGxvd2VyIDQ5IGJpdHMgb2YgdGhlIEZQQ1IgYXJlIHVudXNlZCBieSB0aGUgaGFyZHdhcmUsIHNvIHdlIHVzZQorICogdGhlIGxvd2VyIG9yZGVyIGJpdHMgdG8gc3RvcmUgdGhlIGtlcm5lbCdzIGlkZWEgb2YgdGhlIEZQIG1hc2sgYXMKKyAqIGRlc2NyaWJlZCBpbiB0aGUgQWxwaGEgQXJjaGl0ZWN0dXJlIE1hbnVhbC4KKyAqLworaW50CitmZWdldGVudihmZW52X3QgKmVudnApCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCXVuaW9uIF9fZnBjciByOworCisJLyoKKwkgKiBUaGUgc3lzY2FsbCBhY3RzIGFzIGFuIGltcGxpY2l0IGV4Y2VwdGlvbiBiYXJyaWVyLCBzbyB3ZQorCSAqIG9ubHkgbmVlZCB0byBpc3N1ZSBhbiBleGNiIGFmdGVyIHRoZSBtZl9mcGNyIHRvIGVuc3VyZSB0aGF0CisJICogdGhlIHJlYWQgaXMgZXhlY3V0ZWQgYmVmb3JlIGFueSBzdWJzZXF1ZW50IEZQIG9wcy4KKwkgKi8KKwlzeXNhcmNoKEFMUEhBX0dFVF9GUE1BU0ssIChjaGFyICopJnApOworCV9fbWZfZnBjcigmci5fX2QpOworCSplbnZwID0gci5fX2JpdHMgfCBwLm1hc2s7CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZWhvbGRleGNlcHQoZmVudl90ICplbnZwKQoreworCXN0cnVjdCBtYXNrX2FyZ3MgcDsKKwl1bmlvbiBfX2ZwY3IgcjsKKworCXN5c2FyY2goQUxQSEFfR0VUX0ZQTUFTSywgKGNoYXIgKikmcCk7CisJX19tZl9mcGNyKCZyLl9fZCk7CisJKmVudnAgPSByLl9fYml0cyB8IHAubWFzazsKKwlyLl9fYml0cyAmPSB+KChmZW52X3QpRkVfQUxMX0VYQ0VQVCA8PCBfRlBVU1dfU0hJRlQpOworCV9fbXRfZnBjcihyLl9fZCk7CisJaWYgKHAubWFzayAmIEZFX0FMTF9FWENFUFQpIHsKKwkJcC5tYXNrID0gMDsKKwkJc3lzYXJjaChBTFBIQV9TRVRfRlBNQVNLLCAmcCk7CisJfQorCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICplbnZwKQoreworCXN0cnVjdCBtYXNrX2FyZ3MgcDsKKwl1bmlvbiBfX2ZwY3IgcjsKKworCXAubWFzayA9ICplbnZwICYgRkVfQUxMX0VYQ0VQVDsKKwlzeXNhcmNoKEFMUEhBX1NFVF9GUE1BU0ssICZwKTsKKwlyLl9fYml0cyA9ICplbnZwICYgfkZFX0FMTF9FWENFUFQ7CisJX19tdF9mcGNyKHIuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqZW52cCkKK3sKKwlzdHJ1Y3QgbWFza19hcmdzIHA7CisJdW5pb24gX19mcGNyIG9sZHIsIG5ld3I7CisKKwlwLm1hc2sgPSAqZW52cCAmIEZFX0FMTF9FWENFUFQ7CisJc3lzYXJjaChBTFBIQV9TRVRfRlBNQVNLLCAmcCk7CisJX19tZl9mcGNyKCZvbGRyLl9fZCk7CisJbmV3ci5fX2JpdHMgPSAqZW52cCAmIH5GRV9BTExfRVhDRVBUOworCV9fZXhjYigpOworCV9fbXRfZnBjcihuZXdyLl9fZCk7CisJZmVyYWlzZWV4Y2VwdCgob2xkci5fX2JpdHMgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7IAorfQorCitpbnQKK19fZmVlbmFibGVleGNlcHQoaW50IG1hc2spCit7CisJc3RydWN0IG1hc2tfYXJncyBwOworCisJc3lzYXJjaChBTFBIQV9HRVRfRlBNQVNLLCAmcCk7CisJcC5tYXNrIHw9IChtYXNrICYgRkVfQUxMX0VYQ0VQVCk7CisJc3lzYXJjaChBTFBIQV9TRVRfRlBNQVNLLCAmcCk7CisJcmV0dXJuIChwLm1hc2spOworfQorCitpbnQKK19fZmVkaXNhYmxlZXhjZXB0KGludCBtYXNrKQoreworCXN0cnVjdCBtYXNrX2FyZ3MgcDsKKworCXN5c2FyY2goQUxQSEFfR0VUX0ZQTUFTSywgJnApOworCXAubWFzayAmPSB+KG1hc2sgJiBGRV9BTExfRVhDRVBUKTsKKwlzeXNhcmNoKEFMUEhBX1NFVF9GUE1BU0ssICZwKTsKKwlyZXR1cm4gKHAubWFzayk7Cit9CisKK2ludAorX19mZWdldGV4Y2VwdCh2b2lkKQoreworCXN0cnVjdCBtYXNrX2FyZ3MgcDsKKworCXN5c2FyY2goQUxQSEFfR0VUX0ZQTUFTSywgJnApOworCXJldHVybiAocC5tYXNrKTsKK30KKworX193ZWFrX3JlZmVyZW5jZShfX2ZlZW5hYmxlZXhjZXB0LCBmZWVuYWJsZWV4Y2VwdCk7CitfX3dlYWtfcmVmZXJlbmNlKF9fZmVkaXNhYmxlZXhjZXB0LCBmZWRpc2FibGVleGNlcHQpOworX193ZWFrX3JlZmVyZW5jZShfX2ZlZ2V0ZXhjZXB0LCBmZWdldGV4Y2VwdCk7CmRpZmYgLS1naXQgYS9saWJtL2FscGhhL2ZlbnYuaCBiL2xpYm0vYWxwaGEvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2JjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FscGhhL2ZlbnYuaApAQCAtMCwwICsxLDE4NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYWxwaGEvZmVudi5oLHYgMS4zIDIwMDUvMDMvMTYgMTk6MDM6NDQgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDY0X3QJZmVudl90OwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMgorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDA4CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDEwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgyMAorI2RlZmluZQlGRV9JTlRPVkYJMHg0MAkvKiBub3QgbWFza2FibGUgKi8KKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IEZFX0lOVE9WRiB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgwMAorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAxCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAyCisjZGVmaW5lCUZFX1VQV0FSRAkweDAzCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorI2RlZmluZQlfUk9VTkRfU0hJRlQJNTgKKworI2RlZmluZQlfRlBVU1dfU0hJRlQJNTEKKworI2RlZmluZQlfX2V4Y2IoKQlfX2FzbSBfX3ZvbGF0aWxlKCJleGNiIikKKyNkZWZpbmUJX19tZl9mcGNyKF9fY3cpCV9fYXNtIF9fdm9sYXRpbGUoIm1mX2ZwY3IgJTAiIDogIj1mIiAoKihfX2N3KSkpCisjZGVmaW5lCV9fbXRfZnBjcihfX2N3KQlfX2FzbSBfX3ZvbGF0aWxlKCJtdF9mcGNyICUwIiA6IDogImYiIChfX2N3KSkKKwordW5pb24gX19mcGNyIHsKKwlkb3VibGUgX19kOworCWZlbnZfdCBfX2JpdHM7Cit9OworCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCV9fZXhjYigpOworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJX19yLl9fYml0cyAmPSB+KChmZW52X3QpX19leGNlcHRzIDw8IF9GUFVTV19TSElGVCk7CisJX19tdF9mcGNyKF9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCV9fZXhjYigpOworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJX19leGNiKCk7CisJKl9fZmxhZ3AgPSAoX19yLl9fYml0cyA+PiBfRlBVU1dfU0hJRlQpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKwlmZW52X3QgX194ZmxhZywgX194ZXhjZXB0czsKKworCV9feGZsYWcgPSAoZmVudl90KSpfX2ZsYWdwIDw8IF9GUFVTV19TSElGVDsKKwlfX3hleGNlcHRzID0gKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUOworCV9fZXhjYigpOworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJX19yLl9fYml0cyAmPSB+X194ZXhjZXB0czsKKwlfX3IuX19iaXRzIHw9IF9feGZsYWcgJiBfX3hleGNlcHRzOworCV9fbXRfZnBjcihfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisKKwkvKgorCSAqIFhYWCBHZW5lcmF0aW5nIGV4Y2VwdGlvbnMgdGhpcyB3YXkgZG9lcyBub3QgYWN0dWFsbHkgaW52b2tlCisJICogYSB1c2VybGFuZCB0cmFwIGhhbmRsZXIgd2hlbiBlbmFibGVkLCBidXQgbmVpdGhlciBkbworCSAqIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBhcyBmYXIgYXMgSSBjYW4gdGVsbC4gIFBlcmhhcHMgdGhlcmUKKwkgKiBhcmUgbW9yZSBidWdzIGluIHRoZSBrZXJuZWwgdHJhcCBoYW5kbGVyLgorCSAqLworCWZleGNlcHRfdCBfX2V4ID0gX19leGNlcHRzOworCWZlc2V0ZXhjZXB0ZmxhZygmX19leCwgX19leGNlcHRzKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKChfX3IuX19iaXRzID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCS8qCisJICogTm8gZXhjZXB0aW9uIGJhcnJpZXJzIHNob3VsZCBiZSByZXF1aXJlZCBoZXJlIGlmIHdlIGFzc3VtZQorCSAqIHRoYXQgb25seSBmZXNldHJvdW5kKCkgY2FuIGNoYW5nZSB0aGUgcm91bmRpbmcgbW9kZS4KKwkgKi8KKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCXJldHVybiAoKGludCkoX19yLl9fYml0cyA+PiBfUk9VTkRfU0hJRlQpICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCXVuaW9uIF9fZnBjciBfX3I7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH4oKGZlbnZfdClfUk9VTkRfTUFTSyA8PCBfUk9VTkRfU0hJRlQpOworCV9fci5fX2JpdHMgfD0gKGZlbnZfdClfX3JvdW5kIDw8IF9ST1VORF9TSElGVDsKKwlfX210X2ZwY3IoX19yLl9fZCk7CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CWZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKTsKK2ludAlmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApOworaW50CWZlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKK2ludAlmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK2ludAlmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludAlmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzayk7CitpbnQJZmVnZXRleGNlcHQodm9pZCk7CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vYWxwaGEvc19jb3B5c2lnbi5TIGIvbGlibS9hbHBoYS9zX2NvcHlzaWduLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzODFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYWxwaGEvc19jb3B5c2lnbi5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYWxwaGEvc19jb3B5c2lnbi5TLHYgMS4yIDE5OTkvMDgvMjggMDA6MDY6MDcgcGV0ZXIgRXhwICQgKi8KKy8qCUZyb206IE5ldEJTRDogc19jb3B5c2lnbi5TLHYgMS4zIDE5OTcvMDcvMzAgMjM6NTg6MzgganRjIEV4cAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NiBUaGUgTmV0QlNEIEZvdW5kYXRpb24sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5kYXRpb24KKyAqIGJ5IEouVC4gQ29ua2xpbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5ldEJTRAorICogICAgICAgIEZvdW5kYXRpb24sIEluYy4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUyAKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitMRUFGKGNvcHlzaWduLCAyKQorCWNweXMJZmExLCBmYTAsIGZ2MAorCVJFVAorRU5EKGNvcHlzaWduKQpkaWZmIC0tZ2l0IGEvbGlibS9hbHBoYS9zX2NvcHlzaWduZi5TIGIvbGlibS9hbHBoYS9zX2NvcHlzaWduZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNWVkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FscGhhL3NfY29weXNpZ25mLlMKQEAgLTAsMCArMSw0NSBAQAorLyogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9zX2NvcHlzaWduZi5TLHYgMS4yIDE5OTkvMDgvMjggMDA6MDY6MDggcGV0ZXIgRXhwICQgKi8KKy8qCUZyb206IE5ldEJTRDogc19jb3B5c2lnbmYuUyx2IDEuMyAxOTk3LzA3LzMwIDIzOjU4OjQxIGp0YyBFeHAgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCisgKiBieSBKLlQuIENvbmtsaW4uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBOZXRCU0QKKyAqICAgICAgICBGb3VuZGF0aW9uLCBJbmMuIGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTmV0QlNEIEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitMRUFGKGNvcHlzaWduZiwgMikKKwljcHlzCWZhMSwgZmEwLCBmdjAKKwlSRVQKK0VORChjb3B5c2lnbmYpCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L01ha2VmaWxlLmluYyBiL2xpYm0vYW1kNjQvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGE3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDUgQEAKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9NYWtlZmlsZS5pbmMsdiAxLjQgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQKKworQVJDSF9TUkNTID0gZV9zcXJ0LlMgZV9zcXJ0Zi5TIHNfbGxyaW50LlMgc19sbHJpbnRmLlMgc19scmludC5TIHNfbHJpbnRmLlMgXAorCSAgICBzX3JlbXF1by5TIHNfcmVtcXVvZi5TIHNfc2NhbGJuLlMgc19zY2FsYm5mLlMgc19zY2FsYm5sLlMKK0xEQkxfUFJFQyA9IDY0CmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L19mcG1hdGguaCBiL2xpYm0vYW1kNjQvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMWVjODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L19mcG1hdGguaApAQCAtMCwwICsxLDUwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvYW1kNjQvX2ZwbWF0aC5oLHYgMS42IDIwMDUvMDMvMDcgMDQ6NTU6MjEgZGFzIEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisJCXVuc2lnbmVkIGludAltYW5oCTozMjsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJanVua2wJOjE2OworCQl1bnNpZ25lZCBpbnQJanVua2gJOjMyOworCX0gYml0czsKK307CisKKyNkZWZpbmUJTERCTF9OQklUCTB4ODAwMDAwMDAKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh1KS5iaXRzLm1hbmggJj0gfkxEQkxfTkJJVCkKKworI2RlZmluZQlMREJMX01BTkhfU0laRQkzMgorI2RlZmluZQlMREJMX01BTkxfU0laRQkzMgorCisjZGVmaW5lCUxEQkxfVE9fQVJSQVkzMih1LCBhKSBkbyB7CQkJXAorCShhKVswXSA9ICh1aW50MzJfdCkodSkuYml0cy5tYW5sOwkJXAorCShhKVsxXSA9ICh1aW50MzJfdCkodSkuYml0cy5tYW5oOwkJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9lX3NxcnQuUyBiL2xpYm0vYW1kNjQvZV9zcXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyOWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvZV9zcXJ0LlMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L2Vfc3FydC5TLHYgMS4yIDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIikKKwkKK0VOVFJZKHNxcnQpCisJc3FydHNkCSV4bW0wLCAleG1tMAorCXJldAorCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L2Vfc3FydGYuUyBiL2xpYm0vYW1kNjQvZV9zcXJ0Zi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L2Vfc3FydGYuUwpAQCAtMCwwICsxLDMyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYW1kNjQvZV9zcXJ0Zi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKwkKK0VOVFJZKHNxcnRmKQorCXNxcnRzcwkleG1tMCwgJXhtbTAKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvZmVudi5jIGIvbGlibS9hbWQ2NC9mZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0MzY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvZmVudi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9mZW52LmMsdiAxLjMgMjAwNS8wMy8xNiAxOTowMzo0NSBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWFjaGluZS9mcHUuaD4KKyNpbmNsdWRlIDxmZW52Lmg+CisKK2NvbnN0IGZlbnZfdCBfX2ZlX2RmbF9lbnYgPSB7CisJeyAweGZmZmYwMDAwIHwgX19JTklUSUFMX0ZQVUNXX18sCisJICAweGZmZmYwMDAwLAorCSAgMHhmZmZmZmZmZiwKKwkgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiB9CisJfSwKKwlfX0lOSVRJQUxfTVhDU1JfXworfTsKKworaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpmbGFncCwgaW50IGV4Y2VwdHMpCit7CisJZmVudl90IGVudjsKKworCV9fZm5zdGVudigmZW52Ll9feDg3KTsKKwllbnYuX194ODcuX19zdGF0dXMgJj0gfmV4Y2VwdHM7CisJZW52Ll9feDg3Ll9fc3RhdHVzIHw9ICpmbGFncCAmIGV4Y2VwdHM7CisJX19mbGRlbnYoZW52Ll9feDg3KTsKKworCV9fc3RteGNzcigmZW52Ll9fbXhjc3IpOworCWVudi5fX214Y3NyICY9IH5leGNlcHRzOworCWVudi5fX214Y3NyIHw9ICpmbGFncCAmIGV4Y2VwdHM7CisJX19sZG14Y3NyKGVudi5fX214Y3NyKTsKKworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmVyYWlzZWV4Y2VwdChpbnQgZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgZXggPSBleGNlcHRzOworCisJZmVzZXRleGNlcHRmbGFnKCZleCwgZXhjZXB0cyk7CisJX19md2FpdCgpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmVnZXRlbnYoZmVudl90ICplbnZwKQoreworCWludCBjb250cm9sOworCisJLyoKKwkgKiBmbnN0ZW52IG1hc2tzIGFsbCBleGNlcHRpb25zLCBzbyB3ZSBuZWVkIHRvIHNhdmUgYW5kCisJICogcmVzdG9yZSB0aGUgY29udHJvbCB3b3JkIHRvIGF2b2lkIHRoaXMgc2lkZSBlZmZlY3QuCisJICovCisJX19mbnN0Y3coJmNvbnRyb2wpOworCV9fZm5zdGVudigmZW52cC0+X194ODcpOworCV9fc3RteGNzcigmZW52cC0+X19teGNzcik7CisJX19mbGRjdyhjb250cm9sKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKmVudnApCit7CisJaW50IG14Y3NyOworCisJX19zdG14Y3NyKCZteGNzcik7CisJX19mbnN0ZW52KCZlbnZwLT5fX3g4Nyk7CisJX19mbmNsZXgoKTsKKwllbnZwLT5fX214Y3NyID0gbXhjc3I7CisJbXhjc3IgJj0gfkZFX0FMTF9FWENFUFQ7CisJbXhjc3IgfD0gRkVfQUxMX0VYQ0VQVCA8PCBfU1NFX0VNQVNLX1NISUZUOworCV9fbGRteGNzcihteGNzcik7CisJcmV0dXJuICgwKTsKK30KKworaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKmVudnApCit7CisJaW50IG14Y3NyLCBzdGF0dXM7CisKKwlfX2Zuc3Rzdygmc3RhdHVzKTsKKwlfX3N0bXhjc3IoJm14Y3NyKTsKKwlmZXNldGVudihlbnZwKTsKKwlmZXJhaXNlZXhjZXB0KChteGNzciB8IHN0YXR1cykgJiBGRV9BTExfRVhDRVBUKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK19fZmVlbmFibGVleGNlcHQoaW50IG1hc2spCit7CisJaW50IG14Y3NyLCBjb250cm9sLCBvbWFzazsKKworCW1hc2sgJj0gRkVfQUxMX0VYQ0VQVDsKKwlfX2Zuc3RjdygmY29udHJvbCk7CisJX19zdG14Y3NyKCZteGNzcik7CisJb21hc2sgPSAoY29udHJvbCB8IG14Y3NyID4+IF9TU0VfRU1BU0tfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVDsKKwljb250cm9sICY9IH5tYXNrOworCV9fZmxkY3coY29udHJvbCk7CisJbXhjc3IgJj0gfihtYXNrIDw8IF9TU0VfRU1BU0tfU0hJRlQpOworCV9fbGRteGNzcihteGNzcik7CisJcmV0dXJuICh+b21hc2spOworfQorCitpbnQKK19fZmVkaXNhYmxlZXhjZXB0KGludCBtYXNrKQoreworCWludCBteGNzciwgY29udHJvbCwgb21hc2s7CisKKwltYXNrICY9IEZFX0FMTF9FWENFUFQ7CisJX19mbnN0Y3coJmNvbnRyb2wpOworCV9fc3RteGNzcigmbXhjc3IpOworCW9tYXNrID0gKGNvbnRyb2wgfCBteGNzciA+PiBfU1NFX0VNQVNLX1NISUZUKSAmIEZFX0FMTF9FWENFUFQ7CisJY29udHJvbCB8PSBtYXNrOworCV9fZmxkY3coY29udHJvbCk7CisJbXhjc3IgfD0gbWFzayA8PCBfU1NFX0VNQVNLX1NISUZUOworCV9fbGRteGNzcihteGNzcik7CisJcmV0dXJuICh+b21hc2spOworfQorCitfX3dlYWtfcmVmZXJlbmNlKF9fZmVlbmFibGVleGNlcHQsIGZlZW5hYmxlZXhjZXB0KTsKK19fd2Vha19yZWZlcmVuY2UoX19mZWRpc2FibGVleGNlcHQsIGZlZGlzYWJsZWV4Y2VwdCk7CmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L2ZlbnYuaCBiL2xpYm0vYW1kNjQvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Zjk0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L2ZlbnYuaApAQCAtMCwwICsxLDIwMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYW1kNjQvZmVudi5oLHYgMS41IDIwMDUvMDMvMTYgMjI6MzQ6MTQgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHsKKwkJX191aW50MzJfdAlfX2NvbnRyb2w7CisJCV9fdWludDMyX3QJX19zdGF0dXM7CisJCV9fdWludDMyX3QJX190YWc7CisJCWNoYXIJCV9fb3RoZXJbMTZdOworCX0gX194ODc7CisJX191aW50MzJfdAkJX19teGNzcjsKK30gZmVudl90OworCit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAxCisjZGVmaW5lCUZFX0RFTk9STUFMCTB4MDIKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDQKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwOAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgxMAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MjAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfREVOT1JNQUwgfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9ET1dOV0FSRAkweDA0MDAKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDgwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MGMwMAorI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKworLyoKKyAqIEFzIGNvbXBhcmVkIHRvIHRoZSB4ODcgY29udHJvbCB3b3JkLCB0aGUgU1NFIHVuaXQncyBjb250cm9sIHdvcmQKKyAqIGhhcyB0aGUgcm91bmRpbmcgY29udHJvbCBiaXRzIG9mZnNldCBieSAzIGFuZCB0aGUgZXhjZXB0aW9uIG1hc2sKKyAqIGJpdHMgb2Zmc2V0IGJ5IDcuCisgKi8KKyNkZWZpbmUJX1NTRV9ST1VORF9TSElGVAkzCisjZGVmaW5lCV9TU0VfRU1BU0tfU0hJRlQJNworCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisjZGVmaW5lCV9fZmxkY3coX19jdykJCV9fYXNtIF9fdm9sYXRpbGUoImZsZGN3ICUwIiA6IDogIm0iIChfX2N3KSkKKyNkZWZpbmUJX19mbGRlbnYoX19lbnYpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRlbnYgJTAiIDogOiAibSIgKF9fZW52KSkKKyNkZWZpbmUJX19mbmNsZXgoKQkJX19hc20gX192b2xhdGlsZSgiZm5jbGV4IikKKyNkZWZpbmUJX19mbnN0ZW52KF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0ZW52ICUwIiA6ICI9bSIgKCooX19lbnYpKSkKKyNkZWZpbmUJX19mbnN0Y3coX19jdykJCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RjdyAlMCIgOiAiPW0iICgqKF9fY3cpKSkKKyNkZWZpbmUJX19mbnN0c3coX19zdykJCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RzdyAlMCIgOiAiPWFtIiAoKihfX3N3KSkpCisjZGVmaW5lCV9fZndhaXQoKQkJX19hc20gX192b2xhdGlsZSgiZndhaXQiKQorI2RlZmluZQlfX2xkbXhjc3IoX19jc3IpCV9fYXNtIF9fdm9sYXRpbGUoImxkbXhjc3IgJTAiIDogOiAibSIgKF9fY3NyKSkKKyNkZWZpbmUJX19zdG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJzdG14Y3NyICUwIiA6ICI9bSIgKCooX19jc3IpKSkKKworc3RhdGljIF9faW5saW5lIGludAorZmVjbGVhcmV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2VudjsKKworCWlmIChfX2V4Y2VwdHMgPT0gRkVfQUxMX0VYQ0VQVCkgeworCQlfX2ZuY2xleCgpOworCX0gZWxzZSB7CisJCV9fZm5zdGVudigmX19lbnYuX194ODcpOworCQlfX2Vudi5fX3g4Ny5fX3N0YXR1cyAmPSB+X19leGNlcHRzOworCQlfX2ZsZGVudihfX2Vudi5fX3g4Nyk7CisJfQorCV9fc3RteGNzcigmX19lbnYuX19teGNzcik7CisJX19lbnYuX19teGNzciAmPSB+X19leGNlcHRzOworCV9fbGRteGNzcihfX2Vudi5fX214Y3NyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWludCBfX214Y3NyLCBfX3N0YXR1czsKKworCV9fc3RteGNzcigmX19teGNzcik7CisJX19mbnN0c3coJl9fc3RhdHVzKTsKKwkqX19mbGFncCA9IChfX214Y3NyIHwgX19zdGF0dXMpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKTsKK2ludCBmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX3N0bXhjc3IoJl9fbXhjc3IpOworCV9fZm5zdHN3KCZfX3N0YXR1cyk7CisJcmV0dXJuICgoX19zdGF0dXMgfCBfX214Y3NyKSAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwlpbnQgX19jb250cm9sOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgeDg3IGFuZCB0aGUgU1NFIHVuaXQgYWdyZWUgb24gdGhlCisJICogcm91bmRpbmcgbW9kZS4gIFJlYWRpbmcgdGhlIGNvbnRyb2wgd29yZCBvbiB0aGUgeDg3IHR1cm5zCisJICogb3V0IHRvIGJlIGFib3V0IDUgdGltZXMgZmFzdGVyIHRoYW4gcmVhZGluZyBpdCBvbiB0aGUgU1NFCisJICogdW5pdCBvbiBhbiBPcHRlcm9uIDI0NC4KKwkgKi8KKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlyZXR1cm4gKF9fY29udHJvbCAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlpbnQgX19teGNzciwgX19jb250cm9sOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJX19jb250cm9sICY9IH5fUk9VTkRfTUFTSzsKKwlfX2NvbnRyb2wgfD0gX19yb3VuZDsKKwlfX2ZsZGN3KF9fY29udHJvbCk7CisKKwlfX3N0bXhjc3IoJl9fbXhjc3IpOworCV9fbXhjc3IgJj0gfihfUk9VTkRfTUFTSyA8PCBfU1NFX1JPVU5EX1NISUZUKTsKKwlfX214Y3NyIHw9IF9fcm91bmQgPDwgX1NTRV9ST1VORF9TSElGVDsKKwlfX2xkbXhjc3IoX19teGNzcik7CisKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50IGZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCisJX19mbGRlbnYoX19lbnZwLT5fX3g4Nyk7CisJX19sZG14Y3NyKF9fZW52cC0+X19teGNzcik7CisJcmV0dXJuICgwKTsKK30KKworaW50IGZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50IGZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50IGZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlpbnQgX19jb250cm9sOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgbWFza3MgZm9yIHRoZSB4ODcgYW5kIHRoZSBTU0UgdW5pdCBhcmUKKwkgKiB0aGUgc2FtZS4KKwkgKi8KKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlyZXR1cm4gKH5fX2NvbnRyb2wgJiBGRV9BTExfRVhDRVBUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX2xscmludC5TIGIvbGlibS9hbWQ2NC9zX2xscmludC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWM3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3NfbGxyaW50LlMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfbGxyaW50LlMsdiAxLjEgMjAwNS8wMS8xNSAwMzozMjoyOCBkYXMgRXhwICQiKQorCQorLyogc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpICovCisjZGVmaW5lCWZuCWxscmludAorI2luY2x1ZGUgInNfbHJpbnQuUyIKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19sbHJpbnRmLlMgYi9saWJtL2FtZDY0L3NfbGxyaW50Zi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmNmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3NfbGxyaW50Zi5TCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX2xscmludGYuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisJCisvKiBzaXplb2YobG9uZykgPT0gc2l6ZW9mKGxvbmcgbG9uZykgKi8KKyNkZWZpbmUJZm4JbGxyaW50ZgorI2luY2x1ZGUgInNfbHJpbnRmLlMiCmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L3NfbHJpbnQuUyBiL2xpYm0vYW1kNjQvc19scmludC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWI3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3NfbHJpbnQuUwpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCisjaWZuZGVmIGZuCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX2xyaW50LlMsdiAxLjEgMjAwNS8wMS8xNSAwMzozMjoyOCBkYXMgRXhwICQiKQorI2RlZmluZQlmbglscmludAorI2VuZGlmCisKK0VOVFJZKGZuKQorCWN2dHNkMnNpICV4bW0wLCAlcmF4CisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2FtZDY0L3NfbHJpbnRmLlMgYi9saWJtL2FtZDY0L3NfbHJpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZTgzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19scmludGYuUwpAQCAtMCwwICsxLDM2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCisjaWZuZGVmIGZuCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX2xyaW50Zi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKyNkZWZpbmUJZm4JbHJpbnRmCisjZW5kaWYKKworRU5UUlkoZm4pCisJY3Z0c3Myc2kgJXhtbTAsICVyYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19yZW1xdW8uUyBiL2xpYm0vYW1kNjQvc19yZW1xdW8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYzYjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9zX3JlbXF1by5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIHB1YmxpYy1kb21haW4gcmVtYWluZGVyIHJvdXRpbmUgYnkgSi5ULiBDb25rbGluIDxqdGNATmV0QlNELm9yZz4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX3JlbXF1by5TLHYgMS4xIDIwMDUvMDMvMjUgMDQ6NDA6NDQgZGFzIEV4cCAkIik7IAorCQorRU5UUlkocmVtcXVvKQorCW1vdnNkCSV4bW0wLC04KCVyc3ApCisJbW92c2QJJXhtbTEsLTE2KCVyc3ApCisJZmxkbAktMTYoJXJzcCkKKwlmbGRsCS04KCVyc3ApCisxOglmcHJlbTEKKwlmc3RzdwklYXgKKwlidHcJJDEwLCVheAorCWpjCTFiCisJZnN0cAklc3QoMSkKKy8qIEV4dHJhY3QgdGhlIHRocmVlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBxdW90aWVudCBmcm9tIEMwLEMzLEMxLiAqLworCXNocmwJJDYsJWVheAorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgxMDgsJWVheAorCXJvcmwJJDcsJWVheAorCW9ybAklZWF4LCVlY3gKKwlyb2xsCSQ0LCVlYXgKKwlvcmwJJWVjeCwlZWF4CisJYW5kbAkkNywlZWF4CisvKiBOZWdhdGUgdGhlIHF1b3RpZW50IGJpdHMgaWYgeCp5PDAuICBBdm9pZCB1c2luZyBhbiB1bnByZWRpY3RhYmxlIGJyYW5jaC4gKi8KKwltb3ZsCS0xMiglcnNwKSwlZWN4CisJeG9ybAktNCglcnNwKSwlZWN4CisJc2FybAkkMTYsJWVjeAorCXNhcmwJJDE2LCVlY3gKKwl4b3JsCSVlY3gsJWVheAorCWFuZGwJJDEsJWVjeAorCWFkZGwJJWVjeCwlZWF4CisvKiBTdG9yZSB0aGUgcXVvdGllbnQgYW5kIHJldHVybi4gKi8KKwltb3ZsCSVlYXgsKCVyZGkpCisJZnN0cGwJLTgoJXJzcCkKKwltb3ZzZAktOCglcnNwKSwleG1tMAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX3JlbXF1b2YuUyBiL2xpYm0vYW1kNjQvc19yZW1xdW9mLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19yZW1xdW9mLlMKQEAgLTAsMCArMSw2NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQmFzZWQgb24gcHVibGljLWRvbWFpbiByZW1haW5kZXIgcm91dGluZSBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L3NfcmVtcXVvZi5TLHYgMS4xIDIwMDUvMDMvMjUgMDQ6NDA6NDQgZGFzIEV4cCAkIik7IAorCQorRU5UUlkocmVtcXVvZikKKwltb3ZzcwkleG1tMCwtNCglcnNwKQorCW1vdnNzCSV4bW0xLC04KCVyc3ApCisJZmxkcwktOCglcnNwKQorCWZsZHMJLTQoJXJzcCkKKzE6CWZwcmVtMQorCWZzdHN3CSVheAorCWJ0dwkkMTAsJWF4CisJamMJMWIKKwlmc3RwCSVzdCgxKQorLyogRXh0cmFjdCB0aGUgdGhyZWUgbG93LW9yZGVyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGZyb20gQzAsQzMsQzEuICovCisJc2hybAkkNiwlZWF4CisJbW92bAklZWF4LCVlY3gKKwlhbmRsCSQweDEwOCwlZWF4CisJcm9ybAkkNywlZWF4CisJb3JsCSVlYXgsJWVjeAorCXJvbGwJJDQsJWVheAorCW9ybAklZWN4LCVlYXgKKwlhbmRsCSQ3LCVlYXgKKy8qIE5lZ2F0ZSB0aGUgcXVvdGllbnQgYml0cyBpZiB4Knk8MC4gIEF2b2lkIHVzaW5nIGFuIHVucHJlZGljdGFibGUgYnJhbmNoLiAqLworCW1vdmwJLTgoJXJzcCksJWVjeAorCXhvcmwJLTQoJXJzcCksJWVjeAorCXNhcmwJJDE2LCVlY3gKKwlzYXJsCSQxNiwlZWN4CisJeG9ybAklZWN4LCVlYXgKKwlhbmRsCSQxLCVlY3gKKwlhZGRsCSVlY3gsJWVheAorLyogU3RvcmUgdGhlIHF1b3RpZW50IGFuZCByZXR1cm4uICovCisJbW92bAklZWF4LCglcmRpKQorCWZzdHBzCS00KCVyc3ApCisJbW92c3MJLTQoJXJzcCksJXhtbTAKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19zY2FsYm4uUyBiL2xpYm0vYW1kNjQvc19zY2FsYm4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQyZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hbWQ2NC9zX3NjYWxibi5TCkBAIC0wLDAgKzEsMzkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX3NjYWxibi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKworRU5UUlkoc2NhbGJuKQorCW1vdnNkCSV4bW0wLC04KCVyc3ApCisJbW92bAklZWRpLC0xMiglcnNwKQorCWZpbGRsCS0xMiglcnNwKQorCWZsZGwJLTgoJXJzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCWZzdHBsCS04KCVyc3ApCisJbW92c2QJLTgoJXJzcCksJXhtbTAKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vYW1kNjQvc19zY2FsYm5mLlMgYi9saWJtL2FtZDY0L3Nfc2NhbGJuZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjlhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FtZDY0L3Nfc2NhbGJuZi5TCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX3NjYWxibmYuUyx2IDEuMiAyMDA1LzA5LzEyIDIwOjU0OjAwIGRhcyBFeHAgJCIpCisKK0VOVFJZKHNjYWxibmYpCisJbW92c3MJJXhtbTAsLTgoJXJzcCkKKwltb3ZsCSVlZGksLTQoJXJzcCkKKwlmaWxkbAktNCglcnNwKQorCWZsZHMJLTgoJXJzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCWZzdHBzCS04KCVyc3ApCisJbW92c3MJLTgoJXJzcCksJXhtbTAKKwlyZXQKKworLmdsb2JsIENOQU1FKGxkZXhwZikKKy5zZXQJQ05BTUUobGRleHBmKSxDTkFNRShzY2FsYm5mKQpkaWZmIC0tZ2l0IGEvbGlibS9hbWQ2NC9zX3NjYWxibmwuUyBiL2xpYm0vYW1kNjQvc19zY2FsYm5sLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MjlhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYW1kNjQvc19zY2FsYm5sLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbWQ2NC9zX3NjYWxibmwuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisvKiBSQ1NJRCgiJE5ldEJTRDogc19zY2FsYm5mLlMsdiAxLjQgMTk5OS8wMS8wMiAwNToxNTo0MCBrcmlzdGVydyBFeHAgJCIpICovCisKK0VOVFJZKHNjYWxibmwpCisJbW92bAklZWRpLC00KCVyc3ApCisJZmlsZGwJLTQoJXJzcCkKKwlmbGR0CTgoJXJzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCXJldAorCisuZ2xvYmwJQ05BTUUobGRleHBsKQorLnNldAlDTkFNRShsZGV4cGwpLENOQU1FKHNjYWxibmwpCmRpZmYgLS1naXQgYS9saWJtL2FybS9NYWtlZmlsZS5pbmMgYi9saWJtL2FybS9NYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1OWNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYXJtL01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDMgQEAKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hcm0vTWFrZWZpbGUuaW5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTM6MzUgZGFzIEV4cCAkCisKK0xEQkxfUFJFQyA9IDUzCmRpZmYgLS1naXQgYS9saWJtL2FybS9fZnBtYXRoLmggYi9saWJtL2FybS9fZnBtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllNDM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYXJtL19mcG1hdGguaApAQCAtMCwwICsxLDU1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvYXJtL19mcG1hdGguaCx2IDEuNCAyMDA1LzAzLzIwIDAwOjUzOjUyIGNvZ25ldCBFeHAgJAorICovCisKK3VuaW9uIElFRUVsMmJpdHMgeworCWxvbmcgZG91YmxlCWU7CisJc3RydWN0IHsKKyNpZm5kZWYgX19BUk1FQl9fCisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisjZWxzZQorCQl1bnNpZ25lZCBpbnQJCXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAkJZXhwCToxMTsKKwkJdW5zaWduZWQgaW50CQltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CQltYW5sCTozMjsKKyNlbmRpZgorCX0gYml0czsKK307CisKKyNkZWZpbmUJTERCTF9OQklUCTAKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh2b2lkKTApCisKKyNkZWZpbmUJTERCTF9NQU5IX1NJWkUJMzIKKyNkZWZpbmUJTERCTF9NQU5MX1NJWkUJMzIKKworI2RlZmluZQlMREJMX1RPX0FSUkFZMzIodSwgYSkgZG8gewkJCVwKKwkoYSlbMF0gPSAodWludDMyX3QpKHUpLmJpdHMubWFubDsJCVwKKwkoYSlbMV0gPSAodWludDMyX3QpKHUpLmJpdHMubWFuaDsJCVwKK30gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2xpYm0vYXJtL2ZlbnYuYyBiL2xpYm0vYXJtL2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjlmMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9hcm0vZmVudi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hcm0vZmVudi5jLHYgMS4xIDIwMDQvMDYvMDYgMTA6MDM6NTkgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKworLyoKKyAqIEhvcGVmdWxseSB0aGUgc3lzdGVtIElEIGJ5dGUgaXMgaW1tdXRhYmxlLCBzbyBpdCdzIHZhbGlkIHRvIHVzZQorICogdGhpcyBhcyBhIGRlZmF1bHQgZW52aXJvbm1lbnQuCisgKi8KK2NvbnN0IGZlbnZfdCBfX2ZlX2RmbF9lbnYgPSAwOwpkaWZmIC0tZ2l0IGEvbGlibS9hcm0vZmVudi5oIGIvbGlibS9hcm0vZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2E1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2FybS9mZW52LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FybS9mZW52LmgsdiAxLjUgMjAwNS8wMy8xNiAxOTowMzo0NSBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwordHlwZWRlZgl1aW50MzJfdAlmZW52X3Q7Cit0eXBlZGVmCXVpbnQzMl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMDAxCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDAwMDIKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwMDA0CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDAwMDgKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDAwMTAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwMDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDAwMgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAwMDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisvKiBfX0JFR0lOX0RFQ0xTICovCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHN0YXR1cyBmbGFnIHBvc2l0aW9ucyB0byBtYXNrIGZsYWcgcG9zaXRpb25zICovCisjZGVmaW5lIF9GUFVTV19TSElGVAkxNgorI2RlZmluZQlfRU5BQkxFX01BU0sJKEZFX0FMTF9FWENFUFQgPDwgX0ZQVVNXX1NISUZUKQorCisjaWZkZWYJQVJNX0hBUkRfRkxPQVQKKyNkZWZpbmUJX19yZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJyZnMgJTAiIDogIj1yIiAoKihfX2Zwc3IpKSkKKyNkZWZpbmUJX193ZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJ3ZnMgJTAiIDogOiAiciIgKF9fZnBzcikpCisjZWxzZQorI2RlZmluZSBfX3JmcyhfX2Zwc3IpCisjZGVmaW5lIF9fd2ZzKF9fZnBzcikKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+X19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJKl9fZmxhZ3AgPSBfX2Zwc3IgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJX19mcHNyICY9IH5fX2V4Y2VwdHM7CisJX19mcHNyIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2V4ID0gX19leGNlcHRzOworCisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOwkvKiBYWFggKi8KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJcmV0dXJuIChfX2Zwc3IgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisKKwkvKgorCSAqIEFwcGFyZW50bHksIHRoZSByb3VuZGluZyBtb2RlIGlzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZQorCSAqIGluc3RydWN0aW9uIGZvcm1hdCBvbiBBUk0sIHNvIHRoZSBkeW5hbWljIHJvdW5kaW5nIG1vZGUgaXMKKwkgKiBpbmRldGVybWluYXRlLiAgU29tZSBGUFVzIG1heSBkaWZmZXIuCisJICovCisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisKKwlfX3JmcyhfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19lbnY7CisKKwlfX3JmcygmX19lbnYpOworCSpfX2VudnAgPSBfX2VudjsKKwlfX2VudiAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fd2ZzKF9fZW52KTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fd2ZzKCpfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwlfX3dmcygqX19lbnZwKTsKKwlmZXJhaXNlZXhjZXB0KF9fZnBzciAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7Cit9CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fb2xkX2Zwc3IsIF9fbmV3X2Zwc3I7CisKKwlfX3JmcygmX19vbGRfZnBzcik7CisJX19uZXdfZnBzciA9IF9fb2xkX2Zwc3IgfCAoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUOworCV9fd2ZzKF9fbmV3X2Zwc3IpOworCXJldHVybiAoKF9fb2xkX2Zwc3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfZnBzciwgX19uZXdfZnBzcjsKKworCV9fcmZzKCZfX29sZF9mcHNyKTsKKwlfX25ld19mcHNyID0gX19vbGRfZnBzciAmIH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpIDw8IF9GUFVTV19TSElGVCk7CisJX193ZnMoX19uZXdfZnBzcik7CisJcmV0dXJuICgoX19vbGRfZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCXJldHVybiAoKF9fZnBzciAmIF9FTkFCTEVfTUFTSykgPj4gX0ZQVVNXX1NISUZUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworLyogX19FTkRfREVDTFMgKi8KKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9ic2RzcmMvYl9leHAuYyBiL2xpYm0vYnNkc3JjL2JfZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4NzNiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYnNkc3JjL2JfZXhwLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpZXhwLmMJOC4xIChCZXJrZWxleSkgNi80LzkzIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYnNkc3JjL2JfZXhwLmMsdiAxLjcgMjAwNC8xMi8xNiAyMDo0MDozNyBkYXMgRXhwICQiKTsgKi8KKworCisvKiBFWFAoWCkKKyAqIFJFVFVSTiBUSEUgRVhQT05FTlRJQUwgT0YgWAorICogRE9VQkxFIFBSRUNJU0lPTiAoSUVFRSA1MyBiaXRzLCBWQVggRCBGT1JNQVQgNTYgQklUUykKKyAqIENPREVEIElOIEMgQlkgSy5DLiBORywgMS8xOS84NTsKKyAqIFJFVklTRUQgQlkgSy5DLiBORyBvbiAyLzYvODUsIDIvMTUvODUsIDMvNy84NSwgMy8yNC84NSwgNC8xNi84NSwgNi8xNC84Ni4KKyAqCisgKiBSZXF1aXJlZCBzeXN0ZW0gc3VwcG9ydGVkIGZ1bmN0aW9uczoKKyAqCXNjYWxiKHgsbikKKyAqCWNvcHlzaWduKHgseSkKKyAqCWZpbml0ZSh4KQorICoKKyAqIE1ldGhvZDoKKyAqCTEuIEFyZ3VtZW50IFJlZHVjdGlvbjogZ2l2ZW4gdGhlIGlucHV0IHgsIGZpbmQgciBhbmQgaW50ZWdlciBrIHN1Y2gKKyAqCSAgIHRoYXQKKyAqCSAgICAgICAgICAgICAgICAgICB4ID0gaypsbjIgKyByLCAgfHJ8IDw9IDAuNSpsbjIgLgorICoJICAgciB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIHIgOj0geitjIGZvciBiZXR0ZXIgYWNjdXJhY3kuCisgKgorICoJMi4gQ29tcHV0ZSBleHAocikgYnkKKyAqCisgKgkJZXhwKHIpID0gMSArIHIgKyByKlIxLygyLVIxKSwKKyAqCSAgIHdoZXJlCisgKgkJUjEgPSB4IC0geF4yKihwMSt4XjIqKHAyK3heMioocDMreF4yKihwNCtwNSp4XjIpKSkpLgorICoKKyAqCTMuIGV4cCh4KSA9IDJeayAqIGV4cChyKSAuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWV4cChJTkYpIGlzIElORiwgZXhwKE5hTikgaXMgTmFOOworICoJZXhwKC1JTkYpPSAgMDsKKyAqCWZvciBmaW5pdGUgYXJndW1lbnQsIG9ubHkgZXhwKDApPTEgaXMgZXhhY3QuCisgKgorICogQWNjdXJhY3k6CisgKglleHAoeCkgcmV0dXJucyB0aGUgZXhwb25lbnRpYWwgb2YgeCBuZWFybHkgcm91bmRlZC4gSW4gYSB0ZXN0IHJ1bgorICoJd2l0aCAxLDE1NiwwMDAgcmFuZG9tIGFyZ3VtZW50cyBvbiBhIFZBWCwgdGhlIG1heGltdW0gb2JzZXJ2ZWQKKyAqCWVycm9yIHdhcyAwLjg2OSB1bHBzICh1bml0cyBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKi8KKworI2luY2x1ZGUgIm1hdGhpbXBsLmgiCisKK2NvbnN0IHN0YXRpYyBkb3VibGUgcDEgPSAweDEuNTU1NTU1NTU1NTUzZXAtMzsKK2NvbnN0IHN0YXRpYyBkb3VibGUgcDIgPSAtMHgxLjZjMTZjMTZiZWJkOTNwLTk7Citjb25zdCBzdGF0aWMgZG91YmxlIHAzID0gMHgxLjE1NjZhYWYyNWRlMmNwLTE0OworY29uc3Qgc3RhdGljIGRvdWJsZSBwNCA9IC0weDEuYmJkNDFjNWQyNmJmMXAtMjA7Citjb25zdCBzdGF0aWMgZG91YmxlIHA1ID0gMHgxLjYzNzY5NzJiZWE0ZDBwLTI1OworY29uc3Qgc3RhdGljIGRvdWJsZSBsbjJoaSA9IDB4MS42MmU0MmZlZTAwMDAwcC0xOworY29uc3Qgc3RhdGljIGRvdWJsZSBsbjJsbyA9IDB4MS5hMzllZjM1NzkzYzc2cC0zMzsKK2NvbnN0IHN0YXRpYyBkb3VibGUgbG5odWdlID0gMHgxLjY2MDJiMTViN2VjZjJwOTsKK2NvbnN0IHN0YXRpYyBkb3VibGUgbG50aW55ID0gLTB4MS43N2FmOGViZWFlMzU0cDk7Citjb25zdCBzdGF0aWMgZG91YmxlIGludmxuMiA9IDB4MS43MTU0NzY1MmI4MmZlcDA7CisKKyNpZiAwCitkb3VibGUgZXhwKHgpCitkb3VibGUgeDsKK3sKKwlkb3VibGUgIHosaGksbG8sYzsKKwlpbnQgazsKKworI2lmICFkZWZpbmVkKHZheCkmJiFkZWZpbmVkKHRhaG9lKQorCWlmKHghPXgpIHJldHVybih4KTsJLyogeCBpcyBOYU4gKi8KKyNlbmRpZgkvKiAhZGVmaW5lZCh2YXgpJiYhZGVmaW5lZCh0YWhvZSkgKi8KKwlpZiggeCA8PSBsbmh1Z2UgKSB7CisJCWlmKCB4ID49IGxudGlueSApIHsKKworCQkgICAgLyogYXJndW1lbnQgcmVkdWN0aW9uIDogeCAtLT4geCAtIGsqbG4yICovCisKKwkJCWs9aW52bG4yKngrY29weXNpZ24oMC41LHgpOwkvKiBrPU5JTlQoeC9sbjIpICovCisKKwkJICAgIC8qIGV4cHJlc3MgeC1rKmxuMiBhcyBoaS1sbyBhbmQgbGV0IHg9aGktbG8gcm91bmRlZCAqLworCisJCQloaT14LWsqbG4yaGk7CisJCQl4PWhpLShsbz1rKmxuMmxvKTsKKworCQkgICAgLyogcmV0dXJuIDJeaypbMSt4K3gqYy8oMitjKV0gICovCisJCQl6PXgqeDsKKwkJCWM9IHggLSB6KihwMSt6KihwMit6KihwMyt6KihwNCt6KnA1KSkpKTsKKwkJCXJldHVybiAgc2NhbGIoMS4wKyhoaS0obG8tKHgqYykvKDIuMC1jKSkpLGspOworCisJCX0KKwkJLyogZW5kIG9mIHggPiBsbnRpbnkgKi8KKworCQllbHNlCisJCSAgICAgLyogZXhwKC1iaWcjKSB1bmRlcmZsb3dzIHRvIHplcm8gKi8KKwkJICAgICBpZihmaW5pdGUoeCkpICByZXR1cm4oc2NhbGIoMS4wLC01MDAwKSk7CisKKwkJICAgICAvKiBleHAoLUlORikgaXMgemVybyAqLworCQkgICAgIGVsc2UgcmV0dXJuKDAuMCk7CisJfQorCS8qIGVuZCBvZiB4IDwgbG5odWdlICovCisKKwllbHNlCisJLyogZXhwKElORikgaXMgSU5GLCBleHAoK2JpZyMpIG92ZXJmbG93cyB0byBJTkYgKi8KKwkgICAgcmV0dXJuKCBmaW5pdGUoeCkgPyAgc2NhbGIoMS4wLDUwMDApICA6IHgpOworfQorI2VuZGlmCisKKy8qIHJldHVybnMgZXhwKHIgPSB4ICsgYykgZm9yIHxjfCA8IHx4fCB3aXRoIG5vIG92ZXJsYXAuICAqLworCitkb3VibGUgX19leHBfX0QoeCwgYykKK2RvdWJsZSB4LCBjOworeworCWRvdWJsZSAgeixoaSxsbzsKKwlpbnQgazsKKworCWlmICh4ICE9IHgpCS8qIHggaXMgTmFOICovCisJCXJldHVybih4KTsKKwlpZiAoIHggPD0gbG5odWdlICkgeworCQlpZiAoIHggPj0gbG50aW55ICkgeworCisJCSAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gOiB4IC0tPiB4IC0gaypsbjIgKi8KKwkJCXogPSBpbnZsbjIqeDsKKwkJCWsgPSB6ICsgY29weXNpZ24oLjUsIHgpOworCisJCSAgICAvKiBleHByZXNzICh4K2MpLWsqbG4yIGFzIGhpLWxvIGFuZCBsZXQgeD1oaS1sbyByb3VuZGVkICovCisKKwkJCWhpPSh4LWsqbG4yaGkpOwkJCS8qIEV4YWN0LiAqLworCQkJeD0gaGkgLSAobG8gPSBrKmxuMmxvLWMpOworCQkgICAgLyogcmV0dXJuIDJeaypbMSt4K3gqYy8oMitjKV0gICovCisJCQl6PXgqeDsKKwkJCWM9IHggLSB6KihwMSt6KihwMit6KihwMyt6KihwNCt6KnA1KSkpKTsKKwkJCWMgPSAoeCpjKS8oMi4wLWMpOworCisJCQlyZXR1cm4gIHNjYWxiKDEuKyhoaS0obG8gLSBjKSksIGspOworCQl9CisJCS8qIGVuZCBvZiB4ID4gbG50aW55ICovCisKKwkJZWxzZQorCQkgICAgIC8qIGV4cCgtYmlnIykgdW5kZXJmbG93cyB0byB6ZXJvICovCisJCSAgICAgaWYoZmluaXRlKHgpKSAgcmV0dXJuKHNjYWxiKDEuMCwtNTAwMCkpOworCisJCSAgICAgLyogZXhwKC1JTkYpIGlzIHplcm8gKi8KKwkJICAgICBlbHNlIHJldHVybigwLjApOworCX0KKwkvKiBlbmQgb2YgeCA8IGxuaHVnZSAqLworCisJZWxzZQorCS8qIGV4cChJTkYpIGlzIElORiwgZXhwKCtiaWcjKSBvdmVyZmxvd3MgdG8gSU5GICovCisJICAgIHJldHVybiggZmluaXRlKHgpID8gIHNjYWxiKDEuMCw1MDAwKSAgOiB4KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vYnNkc3JjL2JfbG9nLmMgYi9saWJtL2JzZHNyYy9iX2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2JzZHNyYy9iX2xvZy5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWxvZy5jCTguMiAoQmVya2VsZXkpIDExLzMwLzkzIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vYnNkc3JjL2JfbG9nLmMsdiAxLjggMjAwNS8wOS8xOSAxMToyODoxOSBiZGUgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAibWF0aGltcGwuaCIKKworLyogVGFibGUtZHJpdmVuIG5hdHVyYWwgbG9nYXJpdGhtLgorICoKKyAqIFRoaXMgY29kZSB3YXMgZGVyaXZlZCwgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLCBmcm9tOgorICoJUGV0ZXIgVGFuZywgIlRhYmxlLURyaXZlbiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqCUxvZ2FyaXRobSBpbiBJRUVFIEZsb2F0aW5nLVBvaW50IGFyaXRobWV0aWMuIiBBQ00gVHJhbnMuCisgKglNYXRoIFNvZnR3YXJlLCB2b2wgMTYuIG5vIDQsIHBwIDM3OC00MDAsIERlYyAxOTkwKS4KKyAqCisgKiBDYWxjdWxhdGVzIGxvZygyXm0qRiooMStmL0YpKSwgfGYvanwgPD0gMS8yNTYsCisgKiB3aGVyZSBGID0gai8xMjggZm9yIGogYW4gaW50ZWdlciBpbiBbMCwgMTI4XS4KKyAqCisgKiBsb2coMl5tKSA9IGxvZzJfaGkqbSArIGxvZzJfdGFpbCptCisgKiBzaW5jZSBtIGlzIGFuIGludGVnZXIsIHRoZSBkb21pbmFudCB0ZXJtIGlzIGV4YWN0LgorICogbSBoYXMgYXQgbW9zdCAxMCBkaWdpdHMgKGZvciBzdWJub3JtYWwgbnVtYmVycyksCisgKiBhbmQgbG9nMl9oaSBoYXMgMTEgdHJhaWxpbmcgemVybyBiaXRzLgorICoKKyAqIGxvZyhGKSA9IGxvZ0ZfaGlbal0gKyBsb2dGX2xvW2pdIGlzIGluIHRhYnVsYXIgZm9ybSBpbiBsb2dfdGFibGUuaAorICogbG9nRl9oaVtdICsgNTEyIGlzIGV4YWN0LgorICoKKyAqIGxvZygxK2YvRikgPSAyKmYvKDIqRiArIGYpICsgMS8xMiAqICgyKmYvKDIqRiArIGYpKSoqMyArIC4uLgorICogdGhlIGxlYWRpbmcgdGVybSBpcyBjYWxjdWxhdGVkIHRvIGV4dHJhIHByZWNpc2lvbiBpbiB0d28KKyAqIHBhcnRzLCB0aGUgbGFyZ2VyIG9mIHdoaWNoIGFkZHMgZXhhY3RseSB0byB0aGUgZG9taW5hbnQKKyAqIG0gYW5kIEYgdGVybXMuCisgKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorICoJMS4gd2hlbiBtLCBqIGFyZSBub24temVybyAobSB8IGopLCB1c2UgYWJzb2x1dGUKKyAqCSAgIHByZWNpc2lvbiBmb3IgdGhlIGxlYWRpbmcgdGVybS4KKyAqCTIuIHdoZW4gbSA9IGogPSAwLCB8MS14fCA8IDEvMjU2LCBhbmQgbG9nKHgpIH49ICh4LTEpLgorICoJICAgSW4gdGhpcyBjYXNlLCB1c2UgYSByZWxhdGl2ZSBwcmVjaXNpb24gb2YgMjQgYml0cy4KKyAqIChUaGlzIGlzIGRvbmUgZGlmZmVyZW50bHkgaW4gdGhlIG9yaWdpbmFsIHBhcGVyKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgkwCXJldHVybiBzaWduYWxsaW5nIC1JbmYKKyAqCW5lZwlyZXR1cm4gc2lnbmFsbGluZyBOYU4KKyAqCStJbmYJcmV0dXJuICtJbmYKKyovCisKKyNkZWZpbmUgTiAxMjgKKworLyogVGFibGUgb2YgbG9nKEZqKSA9IGxvZ0ZfaGVhZFtqXSArIGxvZ0ZfdGFpbFtqXSwgZm9yIEZqID0gMStqLzEyOC4KKyAqIFVzZWQgZm9yIGdlbmVyYXRpb24gb2YgZXh0ZW5kIHByZWNpc2lvbiBsb2dhcml0aG1zLgorICogVGhlIGNvbnN0YW50IDM1MTg0MzcyMDg4ODMyIGlzIDJeNDUsIHNvIHRoZSBkaXZpZGUgaXMgZXhhY3QuCisgKiBJdCBlbnN1cmVzIGNvcnJlY3QgcmVhZGluZyBvZiBsb2dGX2hlYWQsIGV2ZW4gZm9yIGluYWNjdXJhdGUKKyAqIGRlY2ltYWwtdG8tYmluYXJ5IGNvbnZlcnNpb24gcm91dGluZXMuICAoRXZlcnlib2R5IGdldHMgdGhlCisgKiByaWdodCBhbnN3ZXIgZm9yIGludGVnZXJzIGxlc3MgdGhhbiAyXjUzLikKKyAqIFZhbHVlcyBmb3IgbG9nKEYpIHdlcmUgZ2VuZXJhdGVkIHVzaW5nIGVycm9yIDwgMTBeLTU3IGFic29sdXRlCisgKiB3aXRoIHRoZSBiYyAtbCBwYWNrYWdlLgorKi8KK3N0YXRpYyBkb3VibGUJQTEgPSAJICAuMDgzMzMzMzMzMzMzMzMxNzg4Mjc7CitzdGF0aWMgZG91YmxlCUEyID0gCSAgLjAxMjUwMDAwMDAwMzc3MTc0OTIzOworc3RhdGljIGRvdWJsZQlBMyA9CSAuMDAyMjMyMTM5OTg3OTE5NDQ3ODA5Oworc3RhdGljIGRvdWJsZQlBNCA9CS4wMDA0MzQ4ODc3Nzc3MDc2MTQ1NzQyOworCitzdGF0aWMgZG91YmxlIGxvZ0ZfaGVhZFtOKzFdID0geworCTAuLAorCS4wMDc3ODIxNDA0NDIwNjAzODEyNDYsCisJLjAxNTUwNDE4NjUzNTk2MzUyNjY5NCwKKwkuMDIzMTY3MDU5MjgxNTQ3NjA4NDA2LAorCS4wMzA3NzE2NTg2NjY3NjUyMzM2NDcsCisJLjAzODMxODg2NDMwMjE0MTI2NDQ4OCwKKwkuMDQ1ODA5NTM2MDMxMjQyNzE0NjcwLAorCS4wNTMyNDQ1MTQ1MTg4Mzc2MDQ1NTUsCisJLjA2MDYyNDYyMTgxNjQ4Njk3ODc4NiwKKwkuMDY3OTUwNjYxOTA4NTI1OTQ0NDU0LAorCS4wNzUyMjM0MjEyMzc1MjQyMzUwMzksCisJLjA4MjQ0MzY2OTIxMDk4ODQ0NjEzOCwKKwkuMDg5NjEyMTU4Njg5NzYwNjkwMzIyLAorCS4wOTY3Mjk2MjY0NTg0NTQ3MzE2MTgsCisJLjEwMzc5Njc5MzY4MTU2NzU3ODQ2MCwKKwkuMTEwODE0MzY2MzQwMjY0MzE0MjAzLAorCS4xMTc3ODMwMzU2NTY0MzAwMDE4MzYsCisJLjEyNDcwMzQ3ODUwMTAzMjgwNTA3MCwKKwkuMTMxNTc2MzU3Nzg4NjE3MzE1MjM2LAorCS4xMzg0MDIzMjI4NTkyOTIzMjYwMjksCisJLjE0NTE4MjAwOTg0NDU3NTA3NzI5NSwKKwkuMTUxOTE2MDQyMDI1NzMyMTY3NTMwLAorCS4xNTg2MDUwMzAxNzY2NTkwNTY0NTEsCisJLjE2NTI0OTU3Mjg5NTM5MDg4Mzc4NiwKKwkuMTcxODUwMjU2OTI2NTE4MzQxMDYwLAorCS4xNzg0MDc2NTc0NzI2ODk2MDY5NDcsCisJLjE4NDkyMjMzODQ5MzgzNDEwNDE1NiwKKwkuMTkxMzk0ODUyOTk5NTY1MDQ2MDQ3LAorCS4xOTc4MjU3NDMzMjk3NTg1NTIxMzUsCisJLjIwNDIxNTU0MTQyODc2NjMwMDY2OCwKKwkuMjEwNTY0NzY5MTA3MzUwMDAyNzQxLAorCS4yMTY4NzM5MzgzMDA1MjMxNTAyNDYsCisJLjIyMzE0MzU1MTMxNDAyNDA4MDA1NiwKKwkuMjI5Mzc0MTAxMDY0ODc3MzIyNjQyLAorCS4yMzU1NjYwNzEzMTI4NjAwMDM2NzIsCisJLjI0MTcxOTkzNjg4Njk2NjAyNDc1OCwKKwkuMjQ3ODM2MTYzOTA0NTk0Mjg2NTc3LAorCS4yNTM5MTUyMDk5ODA3MzI0NzAyODUsCisJLjI1OTk1NzUyNDQzNjY4NjA3MTU2NywKKwkuMjY1OTYzNTQ4NDk2OTg0MDAzNTc3LAorCS4yNzE5MzM3MTU0ODQwMTA0NjMxMTQsCisJLjI3Nzg2ODQ1MTAwMzA4NzEwMjQzNSwKKwkuMjgzNzY4MTczMTMwNzM4NDMyNTE5LAorCS4yODk2MzMyOTI1ODI5NDgzNDI4OTYsCisJLjI5NTQ2NDIxMjg5MzQyMTA2MzE5OSwKKwkuMzAxMjYxMzMwNTc4MTk5NzA0MTc3LAorCS4zMDcwMjUwMzUyOTQ4Mjc4MzA1MTIsCisJLjMxMjc1NTcxMDAwNDIzOTUxNzcyOSwKKwkuMzE4NDUzNzMxMTE4MDk3NDkzODkwLAorCS4zMjQxMTk0Njg2NTQzMTY3MzM1OTEsCisJLjMyOTc1MzI4NjM3MjU3OTE2ODUyOCwKKwkuMzM1MzU1NTQxOTIwNzYyMzM0NDg0LAorCS4zNDA5MjY1ODY5NzA0NTQwODE4OTIsCisJLjM0NjQ2Njc2NzM0NjEwMDgyMzQ4OCwKKwkuMzUxOTc2NDIzMTU2ODg0MjY2MDYzLAorCS4zNTc0NTU4ODg5MjIyMzE2NzkzMTYsCisJLjM2MjkwNTQ5MzY4OTE0MDcxMjM3NiwKKwkuMzY4MzI1NTYxMTU4NTk5MTU3MzUyLAorCS4zNzM3MTY0MDk3OTM4MTQ4MTg4NDAsCisJLjM3OTA3ODM1MjkzNDgxMTg0NjM1MywKKwkuMzg0NDExNjk4OTEwMjk4NTgyNjMyLAorCS4zODk3MTY3NTExNDA0NDA0NjQ5NTEsCisJLjM5NDk5MzgwODI0MDU0MjQyMTExNywKKwkuNDAwMjQzMTY0MTI3NDU5NzQ5NTc5LAorCS40MDU0NjUxMDgxMDc4MTkxMDU0OTgsCisJLjQxMDY1OTkyNDk4NTMzODg3NTU1OCwKKwkuNDE1ODI3ODk1MTQzNTkzMTk1ODI1LAorCS40MjA5NjkyOTQ2NDQyMzczNzk1NDMsCisJLjQyNjA4NDM5NTMxMDY4MTQyOTY5MSwKKwkuNDMxMTczNDY0ODE4MTMwMDE0NDY0LAorCS40MzYyMzY3NjY3NzQ1Mjc0OTU3MjYsCisJLjQ0MTI3NDU2MDgwNTE0MDkzNjI4MSwKKwkuNDQ2Mjg3MTAyNjI4MDQ4MTYwMTEzLAorCS40NTEyNzQ2NDQxMzk2MzAyNTQzNTgsCisJLjQ1NjIzNzQzMzQ4MTg3NDE3NzIzMiwKKwkuNDYxMTc1NzE1MTIyNDA4MjkxNzkwLAorCS40NjYwODk3Mjk5MjQ1MzM0NTc5NjAsCisJLjQ3MDk3OTcxNTIxOTA3MzExMzk4NSwKKwkuNDc1ODQ1OTA0ODY5ODU2ODk0OTQ3LAorCS40ODA2ODg1MjkzNDU1NzA3MTQyMTIsCisJLjQ4NTUwNzgxNTc4MTYwMjQwMzE0OSwKKwkuNDkwMzAzOTg4MDQ1NTI1MzI5NjUzLAorCS40OTUwNzcyNjY3OTgwMzQ1NDMxNzEsCisJLjQ5OTgyNzg2OTU1NjYxMTQwMzgyMiwKKwkuNTA0NTU2MDEwNzUxOTEyMjUzOTA4LAorCS41MDkyNjE5MDE3OTA1MjM1NTIzMzUsCisJLjUxMzk0NTc1MTEwMTM0NjEwNDQwNSwKKwkuNTE4NjA3NzY0MjA4MzU0NjM3OTU4LAorCS41MjMyNDgxNDM3NjUxNTg2MDIwMzYsCisJLjUyNzg2NzA4OTYyMDQ4NTc4NTQxNywKKwkuNTMyNDY0Nzk4ODY5MTE0MDE5OTA4LAorCS41MzcwNDE0NjU4OTczNDU5MTU0MzYsCisJLjU0MTU5NzI4MjQzMjEyMTU3Mzk0NywKKwkuNTQ2MTMyNDM3NTk3NDA3MjYwOTA5LAorCS41NTA2NDcxMTc5NTIzOTQxODI3OTMsCisJLjU1NTE0MTUwNzU0MDYxMTIwMDk2NSwKKwkuNTU5NjE1Nzg3OTM1Mzk5NTY2Nzc3LAorCS41NjQwNzAxMzgyODUzODc2NTY2NTEsCisJLjU2ODUwNDczNTM1MjY4OTc0OTU2MSwKKwkuNTcyOTE5NzUzNTYyMDE4NzQwOTIyLAorCS41NzczMTUzNjUwMzUyNDY5NDEyNjAsCisJLjU4MTY5MTczOTYzNTA2MTgyMTkwMCwKKwkuNTg2MDQ5MDQ1MDAzMTY0NzkyNDMzLAorCS41OTAzODc0NDY2MDIxMDc5NTcwMDUsCisJLjU5NDcwNzEwNzc0NjIxNjkzNDE3NCwKKwkuNTk5MDA4MTg5NjQ1MjQ2NjAyNTk0LAorCS42MDMyOTA4NTE0Mzg5NDE4OTk2ODcsCisJLjYwNzU1NTI1MDIyNDMyMjY2MjY4OCwKKwkuNjExODAxNTQxMTA2NjE1MzMxOTU1LAorCS42MTYwMjk4NzcyMTU2MjM4NTU1OTAsCisJLjYyMDI0MDQwOTc1MTIwNDQyNDUzNywKKwkuNjI0NDMzMjg4MDEyMzY5MzAzMDMyLAorCS42Mjg2MDg2NTk0MjI3NTI2ODAyNTYsCisJLjYzMjc2NjY2OTU3MDYyODQzNzIxMywKKwkuNjM2OTA3NDYyMjM2MTk0OTg3NzgxLAorCS42NDEwMzExNzk0MjA2NzkxMDkxNzEsCisJLjY0NTEzNzk2MTM3MzYyMDc4Mjk3OCwKKwkuNjQ5MjI3OTQ2NjI1NjE1MDA0NDUwLAorCS42NTMzMDEyNzIwMTE5NTg2NDQ3MjUsCisJLjY1NzM1ODA3MjcwOTAzMDIzODkxMSwKKwkuNjYxMzk4NDgyMjQ1MjAzOTIyNTAyLAorCS42NjU0MjI2MzI1NDQ1MDUxNzcwNjUsCisJLjY2OTQzMDY1Mzk0Mjk4MTczNDg3MSwKKwkuNjczNDIyNjc1MjEyMzUwNDQxMTQyLAorCS42NzczOTg4MjM1OTA5MjAwNzM5MTEsCisJLjY4MTM1OTIyNDgwNzIzODIwNjI2NywKKwkuNjg1MzA0MDAzMDk4MjgxMTAwMzkyLAorCS42ODkyMzMyODEyMzg1NTc1MzgwMTcsCisJLjY5MzE0NzE4MDU2MDExNzcwMzg2MgorfTsKKworc3RhdGljIGRvdWJsZSBsb2dGX3RhaWxbTisxXSA9IHsKKwkwLiwKKwktLjAwMDAwMDAwMDAwMDAwNTQzMjI5OTM4NDIwMDQ5LAorCSAuMDAwMDAwMDAwMDAwMDAxNzI3NDU2NzQ5OTcwNjEsCisJLS4wMDAwMDAwMDAwMDAwMTMyMzAxNzgxODIyOTIzMywKKwktLjAwMDAwMDAwMDAwMDAxMTU0NTI3NjI4Mjg5ODcyLAorCS0uMDAwMDAwMDAwMDAwMDA0NjY1Mjk0Njk5NTgzMDAsCisJIC4wMDAwMDAwMDAwMDAwNTE0ODg0OTU3MjY4NTgxMCwKKwktLjAwMDAwMDAwMDAwMDAyNTMyMTY4OTQzMTE3NDQ1LAorCS0uMDAwMDAwMDAwMDAwMDUyMTM2MjA2MzkxMzY1MDQsCisJLS4wMDAwMDAwMDAwMDAwMTgxOTUwNjAwMzAxNjg4MSwKKwkgLjAwMDAwMDAwMDAwMDA2MzI5MDY1OTU4NzI0NTQ0LAorCSAuMDAwMDAwMDAwMDAwMDg2MTQ1MTI5MzYwODc4MTQsCisJLS4wMDAwMDAwMDAwMDAwNzM1NTc3MDIxOTQzNTAyOCwKKwkgLjAwMDAwMDAwMDAwMDA5NjM4MDY3NjU4NTUyMjc3LAorCSAuMDAwMDAwMDAwMDAwMDc1OTg2MzY1OTcxOTQxNDEsCisJIC4wMDAwMDAwMDAwMDAwMjU3OTk5OTEyODMwNjk5MCwKKwktLjAwMDAwMDAwMDAwMDA0NjU0NzI5NzQ3NTk4NDQ0LAorCS0uMDAwMDAwMDAwMDAwMDc1NTY5MjA2ODc0NTEzMzYsCisJIC4wMDAwMDAwMDAwMDAxMDE5NTczNTIyMzcwODQ3MiwKKwktLjAwMDAwMDAwMDAwMDE3MzE5MDM0NDA2NDIyMzA2LAorCS0uMDAwMDAwMDAwMDAwMDc3MTgwMDEzMzY4MjgwOTgsCisJIC4wMDAwMDAwMDAwMDAxMDk4MDc1NDA5OTg1NTIzOCwKKwktLjAwMDAwMDAwMDAwMDAyMDQ3MjM1NzgwMDQ2MTk1LAorCS0uMDAwMDAwMDAwMDAwMDgzNzIwOTEwOTkyMzU5MTIsCisJIC4wMDAwMDAwMDAwMDAxNDA4ODEyNzkzNzExMTEzNSwKKwkgLjAwMDAwMDAwMDAwMDEyODY5MDE3MTU3NTg4MjU3LAorCSAuMDAwMDAwMDAwMDAwMTc3ODg4NTA3NzgxOTgxMDYsCisJIC4wMDAwMDAwMDAwMDAwNjQ0MDg1NjE1MDY5Njg5MSwKKwkgLjAwMDAwMDAwMDAwMDE2MTMyODIyNjY3MjQwODIyLAorCS0uMDAwMDAwMDAwMDAwMDc1NDA5MTY1MTE5NTYxODgsCisJLS4wMDAwMDAwMDAwMDAwMDAzNjUwNzE4ODgzMTc5MCwKKwkgLjAwMDAwMDAwMDAwMDA5MTIwOTM3MjQ5OTE0OTg0LAorCSAuMDAwMDAwMDAwMDAwMTg1Njc1NzA5NTk3OTYwMTAsCisJLS4wMDAwMDAwMDAwMDAwMzE0OTI2NTA2NTE5MTQ4MywKKwktLjAwMDAwMDAwMDAwMDA5MzA5NDU5NDk1MTk2ODg5LAorCSAuMDAwMDAwMDAwMDAwMTc5MTQzMzg2MDEzMjkxMTcsCisJLS4wMDAwMDAwMDAwMDAwMTMwMjk3OTcxNzMzMDg2NiwKKwkgLjAwMDAwMDAwMDAwMDIzMDk3Mzg1MjE3NTg2OTM5LAorCSAuMDAwMDAwMDAwMDAwMjM5OTk1NDA0ODQyMTE3MzcsCisJIC4wMDAwMDAwMDAwMDAxNTM5Mzc3NjE3NDQ1NTQwOCwKKwktLjAwMDAwMDAwMDAwMDM2ODcwNDI4MzE1ODM3Njc4LAorCSAuMDAwMDAwMDAwMDAwMzY5MjAzNzUwODIwODAwODksCisJLS4wMDAwMDAwMDAwMDAwOTM4MzQxNzIyMzY2MzY5OSwKKwkgLjAwMDAwMDAwMDAwMDA5NDMzMzk4MTg5NTEyNjkwLAorCSAuMDAwMDAwMDAwMDAwNDE0ODEzMTg3MDQyNTg1NjgsCisJLS4wMDAwMDAwMDAwMDAwMzc5MjMxNjQ4MDIwOTMxNCwKKwkgLjAwMDAwMDAwMDAwMDA4NDAzMTU2MzA0NzkyNDI0LAorCS0uMDAwMDAwMDAwMDAwMzQyNjI5MzQzNDgyODU0MjksCisJIC4wMDAwMDAwMDAwMDA0MzcxMjE5MTk1NzQyOTE0NSwKKwktLjAwMDAwMDAwMDAwMDEwNDc1NzUwMDU4Nzc2NTQxLAorCS0uMDAwMDAwMDAwMDAwMTExMTg2NzEzODk1NTkzMjMsCisJIC4wMDAwMDAwMDAwMDAzNzU0OTU3NzI1NzI1OTg1MywKKwkgLjAwMDAwMDAwMDAwMDEzOTEyODQxMjEyMTk3NTY1LAorCSAuMDAwMDAwMDAwMDAwMTA3NzU3NDMwMzc1NzI2NDAsCisJIC4wMDAwMDAwMDAwMDAyOTM5MTg1OTE4NzY0ODAwMCwKKwktLjAwMDAwMDAwMDAwMDQyNzkwNTA5MDYwMDYwNzc0LAorCSAuMDAwMDAwMDAwMDAwMjI3NzQwNzYxMTQwMzk1NTUsCisJIC4wMDAwMDAwMDAwMDAxMDg0OTU2OTYyMjk2NzkxMiwKKwktLjAwMDAwMDAwMDAwMDIzMDczODAxOTQ1NzA1NzU4LAorCSAuMDAwMDAwMDAwMDAwMTU3NjEyMDM3NzM5Njk0MzUsCisJIC4wMDAwMDAwMDAwMDAwMzM0NTcxMDI2OTU0NDA4MiwKKwktLjAwMDAwMDAwMDAwMDQxNTI1MTU4MDYzNDM2MTIzLAorCSAuMDAwMDAwMDAwMDAwMzI2NTU2OTg4OTY5MDcxNDYsCisJLS4wMDAwMDAwMDAwMDA0NDcwNDI2NTAxMDQ1MjQ0NiwKKwkgLjAwMDAwMDAwMDAwMDM0NTI3NjQ3OTUyMDM5NzcyLAorCS0uMDAwMDAwMDAwMDAwMDcwNDg5NjIzOTIxMDk3NDYsCisJIC4wMDAwMDAwMDAwMDAxMTc3Njk3ODc1MTM2OTIxNCwKKwktLjAwMDAwMDAwMDAwMDEwNzc0MzQxNDYxNjA5NTc4LAorCSAuMDAwMDAwMDAwMDAwMjE4NjMzNDMyOTMyMTU5MTAsCisJIC4wMDAwMDAwMDAwMDAyNDEzMjYzOTQ5MTMzMzEzMSwKKwkgLjAwMDAwMDAwMDAwMDM5MDU3NDYyMjA5ODMwNzAwLAorCS0uMDAwMDAwMDAwMDAwMjY1NzA2NzkyMDM1NjA3NTEsCisJIC4wMDAwMDAwMDAwMDAzNzEzNTE0MTkxOTU5MjAyMSwKKwktLjAwMDAwMDAwMDAwMDE3MTY2OTIxMzM2MDgyNDMxLAorCS0uMDAwMDAwMDAwMDAwMjg2NTgyODUxNTc5MTQzNTMsCisJLS4wMDAwMDAwMDAwMDAyMzgxMjU0MjI2MzQ0NjgwOSwKKwkgLjAwMDAwMDAwMDAwMDA2NTc2NjU5NzY4NTgwMDYyLAorCS0uMDAwMDAwMDAwMDAwMjgyMTAxNDM4NDYxODEyNjcsCisJIC4wMDAwMDAwMDAwMDAxMDcwMTkzMTc2MjExNDI1NCwKKwkgLjAwMDAwMDAwMDAwMDE4MTE5MzQ2MzY2NDQxMTEwLAorCSAuMDAwMDAwMDAwMDAwMDk4NDA0NjUyNzgyMzI2MjcsCisJLS4wMDAwMDAwMDAwMDAzMzE0OTE1MDI4Mjc1MjU0MiwKKwktLjAwMDAwMDAwMDAwMDE4MzAyODU3MzU2MDQxNjY4LAorCS0uMDAwMDAwMDAwMDAwMTYyMDc0MDAxNTY3NDQ5NDksCisJIC4wMDAwMDAwMDAwMDA0ODMwMzMxNDk0OTU1MzIwMSwKKwktLjAwMDAwMDAwMDAwMDcxNTYwNTUzMTcyMzgyMTE1LAorCSAuMDAwMDAwMDAwMDAwODg4MjEyMzk1MTg1NzE4NTUsCisJLS4wMDAwMDAwMDAwMDAzMDkwMDU4MDUxMzIzODI0NCwKKwktLjAwMDAwMDAwMDAwMDYxMDc2NTUxOTcyODUxNDk2LAorCSAuMDAwMDAwMDAwMDAwMzU2NTk5Njk2NjMzNDc4MzAsCisJIC4wMDAwMDAwMDAwMDAzNTc4MjM5NjU5MTI3NjM4MywKKwktLjAwMDAwMDAwMDAwMDQ2MjI2MDg3MDAxNTQ0NTc4LAorCSAuMDAwMDAwMDAwMDAwNjIyNzk3NjI5MTcyMjUxNTYsCisJIC4wMDAwMDAwMDAwMDA3MjgzODk0NzI3MjA2NTc0MSwKKwkgLjAwMDAwMDAwMDAwMDI2ODA5NjQ2NjE1MjExNjczLAorCS0uMDAwMDAwMDAwMDAwMTA5NjA4MjUwNDYwNTkyNzgsCisJIC4wMDAwMDAwMDAwMDAwMjMxMTk0OTM4MzgwMDUzNywKKwktLjAwMDAwMDAwMDAwMDU4NDY5MDU4MDA1Mjk5MjQ3LAorCS0uMDAwMDAwMDAwMDAwMDIxMDM3NDgyNTExNDQ0OTQsCisJLS4wMDAwMDAwMDAwMDAyMzMyMzE4Mjk0NTU4NzQwOCwKKwktLjAwMDAwMDAwMDAwMDQyMzMzNjk0Mjg4MTQxOTE2LAorCS0uMDAwMDAwMDAwMDAwNDM5MzM5Mzc5Njk3Mzc4NDQsCisJIC4wMDAwMDAwMDAwMDA0MTM0MTY0NzA3MzgzNTU2NSwKKwkgLjAwMDAwMDAwMDAwMDA2ODQxNzYzNjQxNTkxNDY2LAorCSAuMDAwMDAwMDAwMDAwNDc1ODU1MzQwMDQ0MzA2NDEsCisJIC4wMDAwMDAwMDAwMDA4MzY3OTY3ODY3NDc1NzY5NSwKKwktLjAwMDAwMDAwMDAwMDg1NzYzNzM0NjQ2NjU4NjQwLAorCSAuMDAwMDAwMDAwMDAwMjE5MTMyODEyMjkzNDAwOTIsCisJLS4wMDAwMDAwMDAwMDA2MjI0Mjg0MjUzNjQzMTE0OCwKKwktLjAwMDAwMDAwMDAwMDEwOTgzNTk0MzI1NDM4NDMwLAorCSAuMDAwMDAwMDAwMDAwNjUzMTA0MzEzNzc2MzM2NTEsCisJLS4wMDAwMDAwMDAwMDA0NzU4MDE5OTAyMTcxMDc2OSwKKwktLjAwMDAwMDAwMDAwMDM3ODU0MjUxMjY1NDU3MDQwLAorCSAuMDAwMDAwMDAwMDAwNDA5MzkyMzMyMTg2Nzg2NjQsCisJIC4wMDAwMDAwMDAwMDA4NzQyNDM4MzkxNDg1ODI5MSwKKwkgLjAwMDAwMDAwMDAwMDI1MjE4MTg4NDU2ODQyODgyLAorCS0uMDAwMDAwMDAwMDAwMDM2MDgxMzEzNjA0MjI1NTcsCisJLS4wMDAwMDAwMDAwMDA1MDUxODU1NTkyNDI4MDkwMiwKKwkgLjAwMDAwMDAwMDAwMDc4Njk5NDAzMzIzMzU1MzE3LAorCS0uMDAwMDAwMDAwMDAwNjcwMjA4NzY5NjE5NDkwNjAsCisJIC4wMDAwMDAwMDAwMDAxNjEwODU3NTc1MzkzMjQ1OCwKKwkgLjAwMDAwMDAwMDAwMDU4NTI3MTg4NDM2MjUxNTA5LAorCS0uMDAwMDAwMDAwMDAwMzUyNDY3NTcyOTc5MDQ3OTEsCisJLS4wMDAwMDAwMDAwMDAxODM3MjA4NDQ5NTYyOTA1OCwKKwkgLjAwMDAwMDAwMDAwMDg4NjA2Njg5ODEzNDk0OTE2LAorCSAuMDAwMDAwMDAwMDAwNjY0ODYyNjgwNzE0Njg3MDAsCisJIC4wMDAwMDAwMDAwMDA2MzgzMTYxNTE3MDY0NjUxOSwKKwkgLjAwMDAwMDAwMDAwMDI1MTQ0MjMwNzI4Mzc2MDcyLAorCS0uMDAwMDAwMDAwMDAwMTcyMzk0NDQ1MjU2MTQ4MzQKK307CisKKyNpZiAwCitkb3VibGUKKyNpZmRlZiBfQU5TSV9TT1VSQ0UKK2xvZyhkb3VibGUgeCkKKyNlbHNlCitsb2coeCkgZG91YmxlIHg7CisjZW5kaWYKK3sKKwlpbnQgbSwgajsKKwlkb3VibGUgRiwgZiwgZywgcSwgdSwgdTIsIHYsIHplcm8gPSAwLjAsIG9uZSA9IDEuMDsKKwl2b2xhdGlsZSBkb3VibGUgdTE7CisKKwkvKiBDYXRjaCBzcGVjaWFsIGNhc2VzICovCisJaWYgKHggPD0gMCkKKwkJaWYgKHggPT0gemVybykJLyogbG9nKDApID0gLUluZiAqLworCQkJcmV0dXJuICgtb25lL3plcm8pOworCQllbHNlCQkvKiBsb2cobmVnKSA9IE5hTiAqLworCQkJcmV0dXJuICh6ZXJvL3plcm8pOworCWVsc2UgaWYgKCFmaW5pdGUoeCkpCisJCXJldHVybiAoeCt4KTsJCS8qIHggPSBOYU4sIEluZiAqLworCisJLyogQXJndW1lbnQgcmVkdWN0aW9uOiAxIDw9IGcgPCAyOyB4LzJebSA9IGc7CSovCisJLyogeSA9IEYqKDEgKyBmL0YpIGZvciB8ZnwgPD0gMl4tOAkJKi8KKworCW0gPSBsb2diKHgpOworCWcgPSBsZGV4cCh4LCAtbSk7CisJaWYgKG0gPT0gLTEwMjIpIHsKKwkJaiA9IGxvZ2IoZyksIG0gKz0gajsKKwkJZyA9IGxkZXhwKGcsIC1qKTsKKwl9CisJaiA9IE4qKGctMSkgKyAuNTsKKwlGID0gKDEuMC9OKSAqIGogKyAxOwkvKiBGKjEyOCBpcyBhbiBpbnRlZ2VyIGluIFsxMjgsIDUxMl0gKi8KKwlmID0gZyAtIEY7CisKKwkvKiBBcHByb3hpbWF0ZSBleHBhbnNpb24gZm9yIGxvZygxK2YvRikgfj0gdSArIHEgKi8KKwlnID0gMS8oMipGK2YpOworCXUgPSAyKmYqZzsKKwl2ID0gdSp1OworCXEgPSB1KnYqKEExICsgdiooQTIgKyB2KihBMyArIHYqQTQpKSk7CisKKyAgICAvKiBjYXNlIDE6IHUxID0gdSByb3VuZGVkIHRvIDJeLTQzIGFic29sdXRlLiAgU2luY2UgdSA8IDJeLTgsCisgICAgICogCSAgICAgICB1MSBoYXMgYXQgbW9zdCAzNSBiaXRzLCBhbmQgRip1MSBpcyBleGFjdCwgYXMgRiBoYXMgPCA4IGJpdHMuCisgICAgICogICAgICAgICBJdCBhbHNvIGFkZHMgZXhhY3RseSB0byB8bSpsb2cyX2hpICsgbG9nX0ZfaGVhZFtqXSB8IDwgNzUwCisgICAgKi8KKwlpZiAobSB8IGopCisJCXUxID0gdSArIDUxMywgdTEgLT0gNTEzOworCisgICAgLyogY2FzZSAyOgl8MS14fCA8IDEvMjU2LiBUaGUgbS0gYW5kIGotIGRlcGVuZGVudCB0ZXJtcyBhcmUgemVybzsKKyAgICAgKiAJCXUxID0gdSB0byAyNCBiaXRzLgorICAgICovCisJZWxzZQorCQl1MSA9IHUsIFRSVU5DKHUxKTsKKwl1MiA9ICgyLjAqKGYgLSBGKnUxKSAtIHUxKmYpICogZzsKKwkJCS8qIHUxICsgdTIgPSAyZi8oMkYrZikgdG8gZXh0cmEgcHJlY2lzaW9uLgkqLworCisJLyogbG9nKHgpID0gbG9nKDJebSpGKigxK2YvRikpID0JCQkJKi8KKwkvKiAobSpsb2cyX2hpK2xvZ0ZfaGVhZFtqXSt1MSkgKyAobSpsb2cyX2xvK2xvZ0ZfdGFpbFtqXStxKTsJKi8KKwkvKiAoZXhhY3QpICsgKHRpbnkpCQkJCQkJKi8KKworCXUxICs9IG0qbG9nRl9oZWFkW05dICsgbG9nRl9oZWFkW2pdOwkJLyogZXhhY3QgKi8KKwl1MiA9ICh1MiArIGxvZ0ZfdGFpbFtqXSkgKyBxOwkJCS8qIHRpbnkgKi8KKwl1MiArPSBsb2dGX3RhaWxbTl0qbTsKKwlyZXR1cm4gKHUxICsgdTIpOworfQorI2VuZGlmCisKKy8qCisgKiBFeHRyYSBwcmVjaXNpb24gdmFyaWFudCwgcmV0dXJuaW5nIHN0cnVjdCB7ZG91YmxlIGEsIGI7fTsKKyAqIGxvZyh4KSA9IGErYiB0byA2MyBiaXRzLCB3aXRoIGEgcm91bmRlZCB0byAyNiBiaXRzLgorICovCitzdHJ1Y3QgRG91YmxlCisjaWZkZWYgX0FOU0lfU09VUkNFCitfX2xvZ19fRChkb3VibGUgeCkKKyNlbHNlCitfX2xvZ19fRCh4KSBkb3VibGUgeDsKKyNlbmRpZgoreworCWludCBtLCBqOworCWRvdWJsZSBGLCBmLCBnLCBxLCB1LCB2LCB1MjsKKwl2b2xhdGlsZSBkb3VibGUgdTE7CisJc3RydWN0IERvdWJsZSByOworCisJLyogQXJndW1lbnQgcmVkdWN0aW9uOiAxIDw9IGcgPCAyOyB4LzJebSA9IGc7CSovCisJLyogeSA9IEYqKDEgKyBmL0YpIGZvciB8ZnwgPD0gMl4tOAkJKi8KKworCW0gPSBsb2diKHgpOworCWcgPSBsZGV4cCh4LCAtbSk7CisJaWYgKG0gPT0gLTEwMjIpIHsKKwkJaiA9IGxvZ2IoZyksIG0gKz0gajsKKwkJZyA9IGxkZXhwKGcsIC1qKTsKKwl9CisJaiA9IE4qKGctMSkgKyAuNTsKKwlGID0gKDEuMC9OKSAqIGogKyAxOworCWYgPSBnIC0gRjsKKworCWcgPSAxLygyKkYrZik7CisJdSA9IDIqZipnOworCXYgPSB1KnU7CisJcSA9IHUqdiooQTEgKyB2KihBMiArIHYqKEEzICsgdipBNCkpKTsKKwlpZiAobSB8IGopCisJCXUxID0gdSArIDUxMywgdTEgLT0gNTEzOworCWVsc2UKKwkJdTEgPSB1LCBUUlVOQyh1MSk7CisJdTIgPSAoMi4wKihmIC0gRip1MSkgLSB1MSpmKSAqIGc7CisKKwl1MSArPSBtKmxvZ0ZfaGVhZFtOXSArIGxvZ0ZfaGVhZFtqXTsKKworCXUyICs9ICBsb2dGX3RhaWxbal07IHUyICs9IHE7CisJdTIgKz0gbG9nRl90YWlsW05dKm07CisJci5hID0gdTEgKyB1MjsJCQkvKiBPbmx5IGRpZmZlcmVuY2UgaXMgaGVyZSAqLworCVRSVU5DKHIuYSk7CisJci5iID0gKHUxIC0gci5hKSArIHUyOworCXJldHVybiAocik7Cit9CmRpZmYgLS1naXQgYS9saWJtL2JzZHNyYy9iX3RnYW1tYS5jIGIvbGlibS9ic2RzcmMvYl90Z2FtbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZjNWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9ic2RzcmMvYl90Z2FtbWEuYwpAQCAtMCwwICsxLDMxNiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpZ2FtbWEuYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiOworI2VuZGlmIC8qIG5vdCBsaW50ICovCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9ic2RzcmMvYl90Z2FtbWEuYyx2IDEuNyAyMDA1LzA5LzE5IDExOjI4OjE5IGJkZSBFeHAgJCIpOyAqLworCisvKgorICogVGhpcyBjb2RlIGJ5IFAuIE1jSWxyb3ksIE9jdCAxOTkyOworICoKKyAqIFRoZSBmaW5hbmNpYWwgc3VwcG9ydCBvZiBVVU5FVCBDb21tdW5pY2F0aW9ucyBTZXJ2aWNlcyBpcyBncmVhdGZ1bGx5CisgKiBhY2tub3dsZWRnZWQuCisgKi8KKworLy8jaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWF0aC5oIgorI2luY2x1ZGUgIm1hdGhpbXBsLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogTUVUSE9EOgorICogeCA8IDA6IFVzZSByZWZsZWN0aW9uIGZvcm11bGEsIEcoeCkgPSBwaS8oc2luKHBpKngpKngqRyh4KSkKKyAqIAlBdCBuZWdhdGl2ZSBpbnRlZ2VycywgcmV0dXJuICtJbmYsIGFuZCBzZXQgZXJybm8uCisgKgorICogeCA8IDYuNToKKyAqCVVzZSBhcmd1bWVudCByZWR1Y3Rpb24gRyh4KzEpID0geEcoeCkgdG8gcmVhY2ggdGhlCisgKglyYW5nZSBbMS4wNjYxMjQsMi4wNjYxMjRdLiAgVXNlIGEgcmF0aW9uYWwKKyAqCWFwcHJveGltYXRpb24gY2VudGVyZWQgYXQgdGhlIG1pbmltdW0gKHgwKzEpIHRvCisgKgllbnN1cmUgbW9ub3RvbmljaXR5LgorICoKKyAqIHggPj0gNi41OiBVc2UgdGhlIGFzeW1wdG90aWMgYXBwcm94aW1hdGlvbiAoU3RpcmxpbmcncyBmb3JtdWxhKQorICoJYWRqdXN0ZWQgZm9yIGVxdWFsLXJpcHBsZXM6CisgKgorICoJbG9nKEcoeCkpIH49ICh4LS41KSoobG9nKHgpLTEpICsgLjUobG9nKDIqcGkpLTEpICsgMS94KlAoMS8oeCp4KSkKKyAqCisgKglLZWVwIGV4dHJhIHByZWNpc2lvbiBpbiBtdWx0aXBseWluZyAoeC0uNSkobG9nKHgpLTEpLCB0bworICoJYXZvaWQgcHJlbWF0dXJlIHJvdW5kLW9mZi4KKyAqCisgKiBTcGVjaWFsIHZhbHVlczoKKyAqCW5vbi1wb3NpdGl2ZSBpbnRlZ2VyOglTZXQgb3ZlcmZsb3cgdHJhcDsgcmV0dXJuICtJbmY7CisgKgl4ID4gMTcxLjYzOgkJU2V0IG92ZXJmbG93IHRyYXA7IHJldHVybiArSW5mOworICoJTmFOOiAJCQlTZXQgaW52YWxpZCB0cmFwOyAgcmV0dXJuIE5hTgorICoKKyAqIEFjY3VyYWN5OiBHYW1tYSh4KSBpcyBhY2N1cmF0ZSB0byB3aXRoaW4KKyAqCXggPiAwOiAgZXJyb3IgcHJvdmFibHkgPCAwLjl1bHAuCisgKglNYXhpbXVtIG9ic2VydmVkIGluIDEsMDAwLDAwMCB0cmlhbHMgd2FzIC44N3VscC4KKyAqCXggPCAwOgorICoJTWF4aW11bSBvYnNlcnZlZCBlcnJvciA8IDR1bHAgaW4gMSwwMDAsMDAwIHRyaWFscy4KKyAqLworCitzdGF0aWMgZG91YmxlIG5lZ19nYW0oZG91YmxlKTsKK3N0YXRpYyBkb3VibGUgc21hbGxfZ2FtKGRvdWJsZSk7CitzdGF0aWMgZG91YmxlIHNtYWxsZXJfZ2FtKGRvdWJsZSk7CitzdGF0aWMgc3RydWN0IERvdWJsZSBsYXJnZV9nYW0oZG91YmxlKTsKK3N0YXRpYyBzdHJ1Y3QgRG91YmxlIHJhdGZ1bl9nYW0oZG91YmxlLCBkb3VibGUpOworCisvKgorICogUmF0aW9uYWwgYXBwcm94aW1hdGlvbiwgQTAgKyB4KngqUCh4KS9RKHgpLCBvbiB0aGUgaW50ZXJ2YWwKKyAqIFsxLjA2Ni4uLCAyLjA2Ni4uXSBhY2N1cmF0ZSB0byA0LjI1ZS0xOS4KKyAqLworI2RlZmluZSBMRUZUIC0uMzk1NTA3ODEyNQkvKiBsZWZ0IGJvdW5kYXJ5IGZvciByYXQuIGFwcHJveCAqLworI2RlZmluZSB4MCAuNDYxNjMyMTQ0OTY4MzYyMzU2Nzg1CS8qIHhtaW4gLSAxICovCisKKyNkZWZpbmUgYTBfaGkgMC44ODU2MDMxOTQ0MTA4ODg3NDk5MgorI2RlZmluZSBhMF9sbyAtLjAwMDAwMDAwMDAwMDAwMDA0OTk2NDI3MDM2NDY5MDE5Njk1CisjZGVmaW5lIFAwCSA2LjIxMzg5NTcxODIxODIwODYzMDI5MDE3ODAwNzI3ZS0wMQorI2RlZmluZSBQMQkgMi42NTc1NzE5ODY1MTUzMzQ2NjEwNDk3OTE5NzU1M2UtMDEKKyNkZWZpbmUgUDIJIDUuNTM4NTk0NDY0Mjk5MTc0NjEwNjMzMDgwODE3NDhlLTAzCisjZGVmaW5lIFAzCSAxLjM4NDU2Njk4MzA0MDk2NTczODg3MTQ1MjgyODExZS0wMworI2RlZmluZSBQNAkgMi40MDY1OTk1MDAzMjcxMTM2NTgxOTM0ODk2OTgwOGUtMDMKKyNkZWZpbmUgUTAJIDEuNDUwMTk1MzEyNTAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwCisjZGVmaW5lIFExCSAxLjA2MjU4NTIxOTQ4MDE2MTcxMzQzNDU0MDYxNTcxZSswMAorI2RlZmluZSBRMgktMi4wNzQ3NDU2MTk0Mzg1OTkzNjQ0MTQ2OTkyNjY0OWUtMDEKKyNkZWZpbmUgUTMJLTEuNDY3MzQxMzE3ODIwMDU0MjI1MDYyODc1NzMwMTVlLTAxCisjZGVmaW5lIFE0CSAzLjA3ODc4MTc2MTU2MTc1NTIwMzYxNTU3NTczNzc5ZS0wMgorI2RlZmluZSBRNQkgNS4xMjQ0OTM0Nzk4MDY2NjIyMTMzNjA1NDYzMzE4NGUtMDMKKyNkZWZpbmUgUTYJLTEuNzYwMTI3NDE0MzE2NjY5OTUwMTkyMjI4OTg4MzNlLTAzCisjZGVmaW5lIFE3CSA5LjM1MDIxMDIzNTczNzg4OTM1MzcyMTUzMDMwNTU2ZS0wNQorI2RlZmluZSBROAkgNi4xMzI3NTUwNzQ3MjQ0Mzk1ODkyNDc0NTY1MjIzOWUtMDYKKy8qCisgKiBDb25zdGFudHMgZm9yIGxhcmdlIHggYXBwcm94aW1hdGlvbiAoeCBpbiBbNiwgSW5mXSkKKyAqIChBY2N1cmF0ZSB0byAyLjgqMTBeLTE5IGFic29sdXRlKQorICovCisjZGVmaW5lIGxuczJwaV9oaSAwLjQxODk0NTMxMjUwMDAwMAorI2RlZmluZSBsbnMycGlfbG8gLS4wMDAwMDY3NzkyOTUzMjcyNTgyMTk2NzAyNjM1OTUKKyNkZWZpbmUgUGEwCSA4LjMzMzMzMzMzMzMzMzMzMTQ4Mjk2MTYyNTYyNDc0ZS0wMgorI2RlZmluZSBQYTEJLTIuNzc3Nzc3Nzc3NzQ1NDgxMjM1NzkzNzg5NjY0OTdlLTAzCisjZGVmaW5lIFBhMgkgNy45MzY1MDc3ODc1NDQzNTYzMTQ3NjI4Mjc4NjQyM2UtMDQKKyNkZWZpbmUgUGEzCS01Ljk1MjM1MDgyNTY2NjcyODQ3OTUwNzE3MjYyMjIyZS0wNAorI2RlZmluZSBQYTQJIDguNDE0Mjg1NjAzNDY2NTM3MDIxMzU4MjE4MDYyNTJlLTA0CisjZGVmaW5lIFBhNQktMS44OTc3MzUyNjQ2Mzg3OTIwMDM0ODg3MjA4OTQyMWUtMDMKKyNkZWZpbmUgUGE2CSA1LjY5Mzk0NDYzNDM5NDExNjQ5NDA4MDUwNjY0MDc4ZS0wMworI2RlZmluZSBQYTcJLTEuNDQ3MDU1NjI0MjE0Mjg5MTU0NTM4ODAzOTI3NjFlLTAyCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuLCBvbmUgPSAxLjAsIHRpbnkgPSAxZS0zMDA7CisKK2RvdWJsZQordGdhbW1hKHgpCisJZG91YmxlIHg7Cit7CisJc3RydWN0IERvdWJsZSB1OworCisJaWYgKHggPj0gNikgeworCQlpZih4ID4gMTcxLjYzKQorCQkJcmV0dXJuKG9uZS96ZXJvKTsKKwkJdSA9IGxhcmdlX2dhbSh4KTsKKwkJcmV0dXJuKF9fZXhwX19EKHUuYSwgdS5iKSk7CisJfSBlbHNlIGlmICh4ID49IDEuMCArIExFRlQgKyB4MCkKKwkJcmV0dXJuIChzbWFsbF9nYW0oeCkpOworCWVsc2UgaWYgKHggPiAxLmUtMTcpCisJCXJldHVybiAoc21hbGxlcl9nYW0oeCkpOworCWVsc2UgaWYgKHggPiAtMS5lLTE3KSB7CisJCWlmICh4ID09IDAuMCkKKwkJCXJldHVybiAob25lL3gpOworCQlvbmUrMWUtMjA7CQkvKiBSYWlzZSBpbmV4YWN0IGZsYWcuICovCisJCXJldHVybiAob25lL3gpOworCX0gZWxzZSBpZiAoIWZpbml0ZSh4KSkKKwkJcmV0dXJuICh4KngpOwkJLyogeCA9IE5hTiwgLUluZiAqLworCWVsc2UKKwkJcmV0dXJuIChuZWdfZ2FtKHgpKTsKK30KKy8qCisgKiBBY2N1cmF0ZSB0byBtYXgodWxwKDEvMTI4KSBhYnNvbHV0ZSwgMl4tNjYgcmVsYXRpdmUpIGVycm9yLgorICovCitzdGF0aWMgc3RydWN0IERvdWJsZQorbGFyZ2VfZ2FtKHgpCisJZG91YmxlIHg7Cit7CisJZG91YmxlIHosIHA7CisJc3RydWN0IERvdWJsZSB0LCB1LCB2OworCisJeiA9IG9uZS8oeCp4KTsKKwlwID0gUGEwK3oqKFBhMSt6KihQYTIreiooUGEzK3oqKFBhNCt6KihQYTUreiooUGE2K3oqUGE3KSkpKSkpOworCXAgPSBwL3g7CisKKwl1ID0gX19sb2dfX0QoeCk7CisJdS5hIC09IG9uZTsKKwl2LmEgPSAoeCAtPSAuNSk7CisJVFJVTkModi5hKTsKKwl2LmIgPSB4IC0gdi5hOworCXQuYSA9IHYuYSp1LmE7CQkJLyogdCA9ICh4LS41KSoobG9nKHgpLTEpICovCisJdC5iID0gdi5iKnUuYSArIHgqdS5iOworCS8qIHJldHVybiB0LmEgKyB0LmIgKyBsbnMycGlfaGkgKyBsbnMycGlfbG8gKyBwICovCisJdC5iICs9IGxuczJwaV9sbzsgdC5iICs9IHA7CisJdS5hID0gbG5zMnBpX2hpICsgdC5iOyB1LmEgKz0gdC5hOworCXUuYiA9IHQuYSAtIHUuYTsKKwl1LmIgKz0gbG5zMnBpX2hpOyB1LmIgKz0gdC5iOworCXJldHVybiAodSk7Cit9CisvKgorICogR29vZCB0byA8IDEgdWxwLiAgKHByb3ZhYmx5IC45MCB1bHA7IC44NyB1bHAgb24gMSwwMDAsMDAwIHJ1bnMuKQorICogSXQgYWxzbyBoYXMgY29ycmVjdCBtb25vdG9uaWNpdHkuCisgKi8KK3N0YXRpYyBkb3VibGUKK3NtYWxsX2dhbSh4KQorCWRvdWJsZSB4OworeworCWRvdWJsZSB5LCB5bTEsIHQ7CisJc3RydWN0IERvdWJsZSB5eSwgcjsKKwl5ID0geCAtIG9uZTsKKwl5bTEgPSB5IC0gb25lOworCWlmICh5IDw9IDEuMCArIChMRUZUICsgeDApKSB7CisJCXl5ID0gcmF0ZnVuX2dhbSh5IC0geDAsIDApOworCQlyZXR1cm4gKHl5LmEgKyB5eS5iKTsKKwl9CisJci5hID0geTsKKwlUUlVOQyhyLmEpOworCXl5LmEgPSByLmEgLSBvbmU7CisJeSA9IHltMTsKKwl5eS5iID0gci5iID0geSAtIHl5LmE7CisJLyogQXJndW1lbnQgcmVkdWN0aW9uOiBHKHgrMSkgPSB4KkcoeCkgKi8KKwlmb3IgKHltMSA9IHktb25lOyB5bTEgPiBMRUZUICsgeDA7IHkgPSB5bTEtLSwgeXkuYS0tKSB7CisJCXQgPSByLmEqeXkuYTsKKwkJci5iID0gci5hKnl5LmIgKyB5KnIuYjsKKwkJci5hID0gdDsKKwkJVFJVTkMoci5hKTsKKwkJci5iICs9ICh0IC0gci5hKTsKKwl9CisJLyogUmV0dXJuIHIqdGdhbW1hKHkpLiAqLworCXl5ID0gcmF0ZnVuX2dhbSh5IC0geDAsIDApOworCXkgPSByLmIqKHl5LmEgKyB5eS5iKSArIHIuYSp5eS5iOworCXkgKz0geXkuYSpyLmE7CisJcmV0dXJuICh5KTsKK30KKy8qCisgKiBHb29kIG9uICgwLCAxK3gwK0xFRlRdLiAgQWNjdXJhdGUgdG8gMXVscC4KKyAqLworc3RhdGljIGRvdWJsZQorc21hbGxlcl9nYW0oeCkKKwlkb3VibGUgeDsKK3sKKwlkb3VibGUgdCwgZDsKKwlzdHJ1Y3QgRG91YmxlIHIsIHh4OworCWlmICh4IDwgeDAgKyBMRUZUKSB7CisJCXQgPSB4LCBUUlVOQyh0KTsKKwkJZCA9ICh0K3gpKih4LXQpOworCQl0ICo9IHQ7CisJCXh4LmEgPSAodCArIHgpLCBUUlVOQyh4eC5hKTsKKwkJeHguYiA9IHggLSB4eC5hOyB4eC5iICs9IHQ7IHh4LmIgKz0gZDsKKwkJdCA9IChvbmUteDApOyB0ICs9IHg7CisJCWQgPSAob25lLXgwKTsgZCAtPSB0OyBkICs9IHg7CisJCXggPSB4eC5hICsgeHguYjsKKwl9IGVsc2UgeworCQl4eC5hID0gIHgsIFRSVU5DKHh4LmEpOworCQl4eC5iID0geCAtIHh4LmE7CisJCXQgPSB4IC0geDA7CisJCWQgPSAoLXgwIC10KTsgZCArPSB4OworCX0KKwlyID0gcmF0ZnVuX2dhbSh0LCBkKTsKKwlkID0gci5hL3gsIFRSVU5DKGQpOworCXIuYSAtPSBkKnh4LmE7IHIuYSAtPSBkKnh4LmI7IHIuYSArPSByLmI7CisJcmV0dXJuIChkICsgci5hL3gpOworfQorLyoKKyAqIHJldHVybnMgKHorYyleMiAqIFAoeikvUSh6KSArIGEwCisgKi8KK3N0YXRpYyBzdHJ1Y3QgRG91YmxlCityYXRmdW5fZ2FtKHosIGMpCisJZG91YmxlIHosIGM7Cit7CisJZG91YmxlIHAsIHE7CisJc3RydWN0IERvdWJsZSByLCB0OworCisJcSA9IFEwICt6KihRMSt6KihRMit6KihRMyt6KihRNCt6KihRNSt6KihRNit6KihRNyt6KlE4KSkpKSkpKTsKKwlwID0gUDAgKyB6KihQMSArIHoqKFAyICsgeiooUDMgKyB6KlA0KSkpOworCisJLyogcmV0dXJuIHIuYSArIHIuYiA9IGEwICsgKHorYyleMipwL3EsIHdpdGggci5hIHRydW5jYXRlZCB0byAyNiBiaXRzLiAqLworCXAgPSBwL3E7CisJdC5hID0geiwgVFJVTkModC5hKTsJCS8qIHQgfj0geiArIGMgKi8KKwl0LmIgPSAoeiAtIHQuYSkgKyBjOworCXQuYiAqPSAodC5hICsgeik7CisJcSA9ICh0LmEgKj0gdC5hKTsJCS8qIHQgPSAoeitjKV4yICovCisJVFJVTkModC5hKTsKKwl0LmIgKz0gKHEgLSB0LmEpOworCXIuYSA9IHAsIFRSVU5DKHIuYSk7CQkvKiByID0gUC9RICovCisJci5iID0gcCAtIHIuYTsKKwl0LmIgPSB0LmIqcCArIHQuYSpyLmIgKyBhMF9sbzsKKwl0LmEgKj0gci5hOwkJCS8qIHQgPSAoeitjKV4yKihQL1EpICovCisJci5hID0gdC5hICsgYTBfaGksIFRSVU5DKHIuYSk7CisJci5iID0gKChhMF9oaS1yLmEpICsgdC5hKSArIHQuYjsKKwlyZXR1cm4gKHIpOwkJCS8qIHIgPSBhMCArIHQgKi8KK30KKworc3RhdGljIGRvdWJsZQorbmVnX2dhbSh4KQorCWRvdWJsZSB4OworeworCWludCBzZ24gPSAxOworCXN0cnVjdCBEb3VibGUgbGcsIGxzaW5lOworCWRvdWJsZSB5LCB6OworCisJeSA9IGZsb29yKHggKyAuNSk7CisJaWYgKHkgPT0geCkJCS8qIE5lZ2F0aXZlIGludGVnZXIuICovCisJCXJldHVybiAob25lL3plcm8pOworCXogPSBmYWJzKHggLSB5KTsKKwl5ID0gLjUqY2VpbCh4KTsKKwlpZiAoeSA9PSBjZWlsKHkpKQorCQlzZ24gPSAtMTsKKwlpZiAoeiA8IC4yNSkKKwkJeiA9IHNpbihNX1BJKnopOworCWVsc2UKKwkJeiA9IGNvcyhNX1BJKigwLjUteikpOworCS8qIFNwZWNpYWwgY2FzZTogRygxLXgpID0gSW5mOyBHKHgpIG1heSBiZSBub256ZXJvLiAqLworCWlmICh4IDwgLTE3MCkgeworCQlpZiAoeCA8IC0xOTApCisJCQlyZXR1cm4gKChkb3VibGUpc2duKnRpbnkqdGlueSk7CisJCXkgPSBvbmUgLSB4OwkJLyogZXhhY3Q6IDEyOCA8IHx4fCA8IDI1NSAqLworCQlsZyA9IGxhcmdlX2dhbSh5KTsKKwkJbHNpbmUgPSBfX2xvZ19fRChNX1BJL3opOwkvKiA9IFRSVU5DKGxvZyh1KSkgKyBzbWFsbCAqLworCQlsZy5hIC09IGxzaW5lLmE7CQkvKiBleGFjdCAob3Bwb3NpdGUgc2lnbnMpICovCisJCWxnLmIgLT0gbHNpbmUuYjsKKwkJeSA9IC0obGcuYSArIGxnLmIpOworCQl6ID0gKHkgKyBsZy5hKSArIGxnLmI7CisJCXkgPSBfX2V4cF9fRCh5LCB6KTsKKwkJaWYgKHNnbiA8IDApIHkgPSAteTsKKwkJcmV0dXJuICh5KTsKKwl9CisJeSA9IG9uZS14OworCWlmIChvbmUteSA9PSB4KQorCQl5ID0gdGdhbW1hKHkpOworCWVsc2UJCS8qIDEteCBpcyBpbmV4YWN0ICovCisJCXkgPSAteCp0Z2FtbWEoLXgpOworCWlmIChzZ24gPCAwKSB5ID0gLXk7CisJcmV0dXJuIChNX1BJIC8gKHkqeikpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9ic2RzcmMvbWF0aGltcGwuaCBiL2xpYm0vYnNkc3JjL21hdGhpbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzYjI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vYnNkc3JjL21hdGhpbXBsLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpbWF0aGltcGwuaAk4LjEgKEJlcmtlbGV5KSA2LzQvOTMKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vYnNkc3JjL21hdGhpbXBsLmgsdiAxLjcgMjAwNS8xMS8xOCAwNTowMzoxMiBiZGUgRXhwICQKKyAqLworCisjaWZuZGVmIF9NQVRISU1QTF9IXworI2RlZmluZQlfTUFUSElNUExfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIi4uL3NyYy9tYXRoX3ByaXZhdGUuaCIKKworLyoKKyAqIFRSVU5DKCkgaXMgYSBtYWNybyB0aGF0IHNldHMgdGhlIHRyYWlsaW5nIDI3IGJpdHMgaW4gdGhlIG1hbnRpc3NhIG9mIGFuCisgKiBJRUVFIGRvdWJsZSB2YXJpYWJsZSB0byB6ZXJvLiAgSXQgbXVzdCBiZSBleHByZXNzaW9uLWxpa2UgZm9yIHN5bnRhY3RpYworICogcmVhc29ucywgYW5kIHdlIGltcGxlbWVudCB0aGlzIGV4cHJlc3Npb24gdXNpbmcgYW4gaW5saW5lIGZ1bmN0aW9uCisgKiBpbnN0ZWFkIG9mIGEgcHVyZSBtYWNybyB0byBhdm9pZCBkZXBlbmRpbmcgb24gdGhlIGdjYyBmZWF0dXJlIG9mCisgKiBzdGF0ZW1lbnQtZXhwcmVzc2lvbnMuCisgKi8KKyNkZWZpbmUJVFJVTkMoZCkJKF9iX3RydW5jKCYoZCkpKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX2JfdHJ1bmModm9sYXRpbGUgZG91YmxlICpfZHApCit7CisJdWludDMyX3QgX2x3OworCisJR0VUX0xPV19XT1JEKF9sdywgKl9kcCk7CisJU0VUX0xPV19XT1JEKCpfZHAsIF9sdyAmIDB4ZjgwMDAwMDApOworfQorCitzdHJ1Y3QgRG91YmxlIHsKKwlkb3VibGUJYTsKKwlkb3VibGUJYjsKK307CisKKy8qCisgKiBGdW5jdGlvbnMgaW50ZXJuYWwgdG8gdGhlIG1hdGggcGFja2FnZSwgeWV0IG5vdCBzdGF0aWMuCisgKi8KK2RvdWJsZQlfX2V4cF9fRChkb3VibGUsIGRvdWJsZSk7CitzdHJ1Y3QgRG91YmxlIF9fbG9nX19EKGRvdWJsZSk7CisKKyNlbmRpZiAvKiAhX01BVEhJTVBMX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2ZwY2xhc3NpZnkuYyBiL2xpYm0vZnBjbGFzc2lmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjExNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2ZwY2xhc3NpZnkuYwpAQCAtMCwwICsxLDk0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9nZW4vZnBjbGFzc2lmeS5jLHYgMS4yIDIwMDUvMDIvMDYgMDM6MjM6MzEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInNyYy9mcG1hdGguaCIKKworaW50CitfX2ZwY2xhc3NpZnlmKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlpZiAodS5iaXRzLmV4cCA9PSAwKSB7CisJCWlmICh1LmJpdHMubWFuID09IDApCisJCQlyZXR1cm4gKEZQX1pFUk8pOworCQlyZXR1cm4gKEZQX1NVQk5PUk1BTCk7CisJfQorCWlmICh1LmJpdHMuZXhwID09IDI1NSkgeworCQlpZiAodS5iaXRzLm1hbiA9PSAwKQorCQkJcmV0dXJuIChGUF9JTkZJTklURSk7CisJCXJldHVybiAoRlBfTkFOKTsKKwl9CisJcmV0dXJuIChGUF9OT1JNQUwpOworfQorCitpbnQKK19fZnBjbGFzc2lmeWQoZG91YmxlIGQpCit7CisJdW5pb24gSUVFRWQyYml0cyB1OworCisJdS5kID0gZDsKKwlpZiAodS5iaXRzLmV4cCA9PSAwKSB7CisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkKKwkJCXJldHVybiAoRlBfWkVSTyk7CisJCXJldHVybiAoRlBfU1VCTk9STUFMKTsKKwl9CisJaWYgKHUuYml0cy5leHAgPT0gMjA0NykgeworCQlpZiAoKHUuYml0cy5tYW5sIHwgdS5iaXRzLm1hbmgpID09IDApCisJCQlyZXR1cm4gKEZQX0lORklOSVRFKTsKKwkJcmV0dXJuIChGUF9OQU4pOworCX0KKwlyZXR1cm4gKEZQX05PUk1BTCk7Cit9CisKK2ludAorX19mcGNsYXNzaWZ5bChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJaWYgKHUuYml0cy5leHAgPT0gMCkgeworCQlpZiAoKHUuYml0cy5tYW5sIHwgdS5iaXRzLm1hbmgpID09IDApCisJCQlyZXR1cm4gKEZQX1pFUk8pOworCQlyZXR1cm4gKEZQX1NVQk5PUk1BTCk7CisJfQorCW1hc2tfbmJpdF9sKHUpOwkJLyogTWFzayBub3JtYWxpemF0aW9uIGJpdCBpZiBhcHBsaWNhYmxlLiAqLworCWlmICh1LmJpdHMuZXhwID09IDMyNzY3KSB7CisJCWlmICgodS5iaXRzLm1hbmwgfCB1LmJpdHMubWFuaCkgPT0gMCkKKwkJCXJldHVybiAoRlBfSU5GSU5JVEUpOworCQlyZXR1cm4gKEZQX05BTik7CisJfQorCXJldHVybiAoRlBfTk9STUFMKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGlibS9pMzg2L19mcG1hdGguaCBiL2xpYm0vaTM4Ni9fZnBtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MTlkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ni9fZnBtYXRoLmgKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL2kzODYvX2ZwbWF0aC5oLHYgMS41IDIwMDUvMDMvMDcgMDQ6NTU6MjIgZGFzIEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisJCXVuc2lnbmVkIGludAltYW5oCTozMjsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJanVuawk6MTY7CisJfSBiaXRzOworfTsKKworI2RlZmluZQlMREJMX05CSVQJMHg4MDAwMDAwMAorI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHUpLmJpdHMubWFuaCAmPSB+TERCTF9OQklUKQorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTMyCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL2kzODcvTWFrZWZpbGUuaW5jIGIvbGlibS9pMzg3L01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNhNTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDE4IEBACisjICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9NYWtlZmlsZS5pbmMsdiAxLjcgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQKKworQVJDSF9TUkNTID0gZV9leHAuUyBlX2Ztb2QuUyBlX2xvZy5TIGVfbG9nMTAuUyBcCisJICAgIGVfcmVtYWluZGVyLlMgZV9zY2FsYi5TIGVfc3FydC5TIHNfY2VpbC5TIHNfY29weXNpZ24uUyBcCisJICAgIHNfY29zLlMgc19maW5pdGUuUyBzX2Zsb29yLlMgc19sbHJpbnQuUyBzX2xvZ2IuUyBzX2xyaW50LlMgXAorCSAgICBzX3JlbXF1by5TIHNfcmludC5TIHNfc2NhbGJuLlMgc19zaWduaWZpY2FuZC5TIHNfc2luLlMgc190YW4uUyBcCisJICAgIHNfdHJ1bmMuUworCisjIGZsb2F0IGNvdW50ZXJwYXJ0cworQVJDSF9TUkNTKz0gZV9sb2cxMGYuUyBlX2xvZ2YuUyBlX3JlbWFpbmRlcmYuUyBlX3NjYWxiZi5TIFwKKwkgICAgZV9zcXJ0Zi5TIHNfY2VpbGYuUyBzX2NvcHlzaWduZi5TIHNfZmxvb3JmLlMgXAorCSAgICBzX2xscmludGYuUyBzX2xvZ2JmLlMgc19scmludGYuUyBcCisJICAgIHNfcmVtcXVvZi5TIHNfcmludGYuUyBzX3NjYWxibmYuUyBzX3NpZ25pZmljYW5kZi5TIHNfdHJ1bmNmLlMKKworIyBsb25nIGRvdWJsZSBjb3VudGVycGFydHMKK0FSQ0hfU1JDUys9IHNfY2VpbGwuUyBzX2NvcHlzaWdubC5TIHNfZmxvb3JsLlMgc19zY2FsYm5sLlMgc190cnVuY2wuUworCitMREJMX1BSRUMgPSA2NAkjIFhYWCA2NC1iaXQgZm9ybWF0LCBidXQgdHJ1bmNhdGVkIHRvIDUzIGJpdHMKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX2V4cC5TIGIvbGlibS9pMzg3L2VfZXhwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4YTZlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX2V4cC5TCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX2V4cC5TLHYgMS4xMSAyMDA1LzEwLzMwIDEyOjIxOjAyIGJkZSBFeHAgJCIpCisKKy8qIGVeeCA9IDJeKHggKiBsb2cyKGUpKSAqLworRU5UUlkoZXhwKQorCS8qCisJICogSWYgeCBpcyArLUluZiwgdGhlbiB0aGUgc3VidHJhY3Rpb24gd291bGQgZ2l2ZSBJbmYtSW5mID0gTmFOLgorCSAqIEF2b2lkIHRoaXMuICBBbHNvIGF2b2lkIGl0IGlmIHggaXMgTmFOIGZvciBjb252ZW5pZW5jZS4KKwkgKi8KKwltb3ZsCTgoJWVzcCksJWVheAorCWFuZGwJJDB4N2ZmZmZmZmYsJWVheAorCWNtcGwJJDB4N2ZmMDAwMDAsJWVheAorCWphZQl4X0luZl9vcl9OYU4KKworCWZsZGwJNCglZXNwKQorCisJLyoKKwkgKiBFeHRlbmRlZCBwcmVjaXNpb24gaXMgbmVlZGVkIHRvIHJlZHVjZSB0aGUgbWF4aW11bSBlcnJvciBmcm9tCisJICogaHVuZHJlZHMgb2YgdWxwcyB0byBsZXNzIHRoYW4gMSB1bHAuICBTd2l0Y2ggdG8gaXQgaWYgbmVjZXNzYXJ5LgorCSAqIFdlIG1heSBhcyB3ZWxsIHNldCB0aGUgcm91bmRpbmcgbW9kZSB0byB0by1uZWFyZXN0IGFuZCBtYXNrIHRyYXBzCisJICogaWYgd2Ugc3dpdGNoLgorCSAqLworCWZzdGN3CTQoJWVzcCkKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDB4MDMwMCwlZWF4CisJY21wbAkkMHgwMzAwLCVlYXgJCS8qIFJDID09IDAgJiYgUEMgPT0gMz8gKi8KKwlqZQkxZgkJCS8qIGp1bXAgaWYgbW9kZSBpcyBnb29kICovCisJbW92bAkkMHgxMzdmLDgoJWVzcCkKKwlmbGRjdwk4KCVlc3ApCisxOgorCWZsZGwyZQorCWZtdWxwCQkJCS8qIHggKiBsb2cyKGUpICovCisJZnN0CSVzdCgxKQorCWZybmRpbnQJCQkJLyogaW50KHggKiBsb2cyKGUpKSAqLworCWZzdAklc3QoMikKKwlmc3VicnAJCQkJLyogZnJhY3QoeCAqIGxvZzIoZSkpICovCisJZjJ4bTEJCQkJLyogMl4oZnJhY3QoeCAqIGxvZzIoZSkpKSAtIDEgKi8gCisJZmxkMQorCWZhZGRwCQkJCS8qIDJeKGZyYWN0KHggKiBsb2cyKGUpKSkgKi8KKwlmc2NhbGUJCQkJLyogZV54ICovCisJZnN0cAklc3QoMSkKKwlqZQkxZgorCWZsZGN3CTQoJWVzcCkKKzE6CisJcmV0CisKK3hfSW5mX29yX05hTjoKKwkvKgorCSAqIFJldHVybiAwIGlmIHggaXMgLUluZi4gIE90aGVyd2lzZSBqdXN0IHJldHVybiB4OyB3aGVuIHggaXMgSW5mCisJICogdGhpcyBnaXZlcyBJbmYsIGFuZCB3aGVuIHggaXMgYSBOYU4gdGhpcyBnaXZlcyB0aGUgc2FtZSByZXN1bHQKKwkgKiBhcyAoeCArIHgpICh4IHF1aWV0ZWQpLgorCSAqLworCWNtcGwJJDB4ZmZmMDAwMDAsOCglZXNwKQorCWpuZQl4X25vdF9taW51c19JbmYKKwljbXBsCSQwLDQoJWVzcCkKKwlqbmUJeF9ub3RfbWludXNfSW5mCisJZmxkegorCXJldAorCit4X25vdF9taW51c19JbmY6CisJZmxkbAk0KCVlc3ApCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZV9mbW9kLlMgYi9saWJtL2kzODcvZV9mbW9kLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzNDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX2Ztb2QuUwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZV9mbW9kLlMsdiAxLjggMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKQorCitFTlRSWShmbW9kKQorCWZsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKzE6CWZwcmVtCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX2xvZy5TIGIvbGlibS9pMzg3L2VfbG9nLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhYWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX2xvZy5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX2xvZy5TLHYgMS43IDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIikKKworRU5UUlkobG9nKQorCWZsZGxuMgorCWZsZGwJNCglZXNwKQorCWZ5bDJ4CisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZV9sb2cxMC5TIGIvbGlibS9pMzg3L2VfbG9nMTAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njk1ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2VfbG9nMTAuUwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZV9sb2cxMC5TLHYgMS43IDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIikKKworRU5UUlkobG9nMTApCisJZmxkbGcyCisJZmxkbAk0KCVlc3ApCisJZnlsMngKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX2xvZzEwZi5TIGIvbGlibS9pMzg3L2VfbG9nMTBmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkNjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX2xvZzEwZi5TCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX2xvZzEwZi5TLHYgMS4yIDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogZV9sb2cxMGYuUyx2IDEuMSAxOTk2LzA3LzAzIDE2OjUwOjIyIGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGxvZzEwZikKKwlmbGRsZzIKKwlmbGRzCTQoJWVzcCkKKwlmeWwyeAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2VfbG9nZi5TIGIvbGlibS9pMzg3L2VfbG9nZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmM2JkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9sb2dmLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2VfbG9nZi5TLHYgMS4yIDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogZV9sb2dmLlMsdiAxLjIgMTk5Ni8wNy8wNiAwMDoxNTo0NSBqdGMgRXhwICQiKSAqLworCitFTlRSWShsb2dmKQorCWZsZGxuMgorCWZsZHMJNCglZXNwKQorCWZ5bDJ4CisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvZV9yZW1haW5kZXIuUyBiL2xpYm0vaTM4Ny9lX3JlbWFpbmRlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGQ2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9yZW1haW5kZXIuUwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZV9yZW1haW5kZXIuUyx2IDEuOCAyMDA1LzAyLzA0IDE0OjA4OjMyIGRhcyBFeHAgJCIpCisKK0VOVFJZKHJlbWFpbmRlcikKKwlmbGRsCTEyKCVlc3ApCisJZmxkbAk0KCVlc3ApCisxOglmcHJlbTEKKwlmc3RzdwklYXgKKwlzYWhmCisJanAJMWIKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2VfcmVtYWluZGVyZi5TIGIvbGlibS9pMzg3L2VfcmVtYWluZGVyZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWNhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9yZW1haW5kZXJmLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2VfcmVtYWluZGVyZi5TLHYgMS4yIDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogZV9yZW1haW5kZXJmLlMsdiAxLjIgMTk5NS8wNS8wOCAyMzo0OTo0NyBqdGMgRXhwICQiKSAqLworCitFTlRSWShyZW1haW5kZXJmKQorCWZsZHMJOCglZXNwKQorCWZsZHMJNCglZXNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX3NjYWxiLlMgYi9saWJtL2kzODcvZV9zY2FsYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODY1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9zY2FsYi5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX3NjYWxiLlMsdiAxLjggMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKQorCitFTlRSWShzY2FsYikKKwlmbGRsCTEyKCVlc3ApCisJZmxkbAk0KCVlc3ApCisJZnNjYWxlCisJZnN0cAklc3QoMSkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX3NjYWxiZi5TIGIvbGlibS9pMzg3L2Vfc2NhbGJmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlMGQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9lX3NjYWxiZi5TCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX3NjYWxiZi5TLHYgMS4yIDIwMDUvMDIvMDQgMTQ6MDg6MzIgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogZV9zY2FsYmYuUyx2IDEuMSAxOTk2LzA3LzAzIDE2OjUwOjI0IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKHNjYWxiZikKKwlmbGRzCTgoJWVzcCkKKwlmbGRzCTQoJWVzcCkKKwlmc2NhbGUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX3NxcnQuUyBiL2xpYm0vaTM4Ny9lX3NxcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U5NjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L2Vfc3FydC5TCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX3NxcnQuUyx2IDEuNyAyMDA1LzAyLzA0IDE0OjA4OjMyIGRhcyBFeHAgJCIpCisKK0VOVFJZKHNxcnQpCisJZmxkbAk0KCVlc3ApCisJZnNxcnQKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9lX3NxcnRmLlMgYi9saWJtL2kzODcvZV9zcXJ0Zi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzU2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZV9zcXJ0Zi5TCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9lX3NxcnRmLlMsdiAxLjIgMjAwNS8wMi8wNCAxNDowODozMiBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBlX3NxcnRmLlMsdiAxLjIgMTk5NS8wNS8wOCAyMzo1MDoxNCBqdGMgRXhwICQiKSAqLworCitFTlRSWShzcXJ0ZikKKwlmbGRzCTQoJWVzcCkKKwlmc3FydAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L2ZlbnYuYyBiL2xpYm0vaTM4Ny9mZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NGZhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9mZW52LmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZmVudi5jLHYgMS4yIDIwMDUvMDMvMTcgMjI6MjE6NDYgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIm5weC5oIgorI2luY2x1ZGUgImZlbnYuaCIKKworY29uc3QgZmVudl90IF9fZmVfZGZsX2VudiA9IHsKKwlfX0lOSVRJQUxfTlBYQ1dfXywKKwkweDAwMDAsCisJMHgwMDAwLAorCTB4MWY4MCwKKwkweGZmZmZmZmZmLAorCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYgfQorfTsKKworZW51bSBfX3NzZV9zdXBwb3J0IF9faGFzX3NzZSA9CisjaWZkZWYgX19TU0VfXworCV9fU1NFX1lFUzsKKyNlbHNlCisJX19TU0VfVU5LOworI2VuZGlmCisKKyNkZWZpbmUJZ2V0ZmwoeCkJX19hc20gX192b2xhdGlsZSgicHVzaGZsXG5cdHBvcGwgJTAiIDogIj1tciIgKCooeCkpKQorI2RlZmluZQlzZXRmbCh4KQlfX2FzbSBfX3ZvbGF0aWxlKCJwdXNobCAlMFxuXHRwb3BmbCIgOiA6ICJnIiAoeCkpCisjZGVmaW5lCWNwdWlkX2R4KHgpCV9fYXNtIF9fdm9sYXRpbGUoInB1c2hsICUlZWJ4XG5cdG1vdmwgJDEsICUlZWF4XG5cdCIgIFwKKwkJCQkJICJjcHVpZFxuXHRwb3BsICUlZWJ4IgkJICAgICAgXAorCQkJCQk6ICI9ZCIgKCooeCkpIDogOiAiZWF4IiwgImVjeCIpCisKKy8qCisgKiBUZXN0IGZvciBTU0Ugc3VwcG9ydCBvbiB0aGlzIHByb2Nlc3Nvci4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlCisgKiB3ZSBuZWVkIHRvIHVzZSBsZG14Y3NyL3N0bXhjc3IgdG8gZ2V0IGNvcnJlY3QgcmVzdWx0cyBpZiBhbnkgcGFydAorICogb2YgdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkIHRvIHVzZSBTU0UgZmxvYXRpbmctcG9pbnQsIGJ1dCB3ZSBjYW4ndAorICogdXNlIFNTRSBvbiBvbGRlciBwcm9jZXNzb3JzLgorICovCitpbnQKK19fdGVzdF9zc2Uodm9pZCkKK3sKKwlpbnQgZmxhZywgbmZsYWc7CisJaW50IGR4X2ZlYXR1cmVzOworCisJLyogQW0gSSBhIDQ4Nj8gKi8KKwlnZXRmbCgmZmxhZyk7CisJbmZsYWcgPSBmbGFnIF4gMHgyMDAwMDA7CisJc2V0ZmwobmZsYWcpOworCWdldGZsKCZuZmxhZyk7CisJaWYgKGZsYWcgIT0gbmZsYWcpIHsKKwkJLyogTm90IGEgNDg2LCBzbyBDUFVJRCBzaG91bGQgd29yay4gKi8KKwkJY3B1aWRfZHgoJmR4X2ZlYXR1cmVzKTsKKwkJaWYgKGR4X2ZlYXR1cmVzICYgMHgyMDAwMDAwKSB7CisJCQlfX2hhc19zc2UgPSBfX1NTRV9ZRVM7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCV9faGFzX3NzZSA9IF9fU1NFX05POworCXJldHVybiAoMCk7Cit9CisKK2ludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqZmxhZ3AsIGludCBleGNlcHRzKQoreworCWZlbnZfdCBlbnY7CisJaW50IG14Y3NyOworCisJX19mbnN0ZW52KCZlbnYpOworCWVudi5fX3N0YXR1cyAmPSB+ZXhjZXB0czsKKwllbnYuX19zdGF0dXMgfD0gKmZsYWdwICYgZXhjZXB0czsKKwlfX2ZsZGVudihlbnYpOworCisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCV9fc3RteGNzcigmbXhjc3IpOworCQlteGNzciAmPSB+ZXhjZXB0czsKKwkJbXhjc3IgfD0gKmZsYWdwICYgZXhjZXB0czsKKwkJX19sZG14Y3NyKG14Y3NyKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZlcmFpc2VleGNlcHQoaW50IGV4Y2VwdHMpCit7CisJZmV4Y2VwdF90IGV4ID0gZXhjZXB0czsKKworCWZlc2V0ZXhjZXB0ZmxhZygmZXgsIGV4Y2VwdHMpOworCV9fZndhaXQoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqZW52cCkKK3sKKwlpbnQgY29udHJvbCwgbXhjc3I7CisKKwkvKgorCSAqIGZuc3RlbnYgbWFza3MgYWxsIGV4Y2VwdGlvbnMsIHNvIHdlIG5lZWQgdG8gc2F2ZSBhbmQKKwkgKiByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQgdG8gYXZvaWQgdGhpcyBzaWRlIGVmZmVjdC4KKwkgKi8KKwlfX2Zuc3RjdygmY29udHJvbCk7CisJX19mbnN0ZW52KGVudnApOworCWlmIChfX0hBU19TU0UoKSkgeworCQlfX3N0bXhjc3IoJm14Y3NyKTsKKwkJX19zZXRfbXhjc3IoKmVudnAsIG14Y3NyKTsKKwl9CisJX19mbGRjdyhjb250cm9sKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKmVudnApCit7CisJaW50IG14Y3NyOworCisJX19mbnN0ZW52KGVudnApOworCV9fZm5jbGV4KCk7CisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCV9fc3RteGNzcigmbXhjc3IpOworCQlfX3NldF9teGNzcigqZW52cCwgbXhjc3IpOworCQlteGNzciAmPSB+RkVfQUxMX0VYQ0VQVDsKKwkJbXhjc3IgfD0gRkVfQUxMX0VYQ0VQVCA8PCBfU1NFX0VNQVNLX1NISUZUOworCQlfX2xkbXhjc3IobXhjc3IpOworCX0KKwlyZXR1cm4gKDApOworfQorCitpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqZW52cCkKK3sKKwlpbnQgbXhjc3IsIHN0YXR1czsKKworCV9fZm5zdHN3KCZzdGF0dXMpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZteGNzcik7CisJZWxzZQorCQlteGNzciA9IDA7CisJZmVzZXRlbnYoZW52cCk7CisJZmVyYWlzZWV4Y2VwdCgobXhjc3IgfCBzdGF0dXMpICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KKworaW50CitfX2ZlZW5hYmxlZXhjZXB0KGludCBtYXNrKQoreworCWludCBteGNzciwgY29udHJvbCwgb21hc2s7CisKKwltYXNrICY9IEZFX0FMTF9FWENFUFQ7CisJX19mbnN0Y3coJmNvbnRyb2wpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZteGNzcik7CisJZWxzZQorCQlteGNzciA9IDA7CisJb21hc2sgPSAoY29udHJvbCB8IG14Y3NyID4+IF9TU0VfRU1BU0tfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVDsKKwljb250cm9sICY9IH5tYXNrOworCV9fZmxkY3coY29udHJvbCk7CisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCW14Y3NyICY9IH4obWFzayA8PCBfU1NFX0VNQVNLX1NISUZUKTsKKwkJX19sZG14Y3NyKG14Y3NyKTsKKwl9CisJcmV0dXJuICh+b21hc2spOworfQorCitpbnQKK19fZmVkaXNhYmxlZXhjZXB0KGludCBtYXNrKQoreworCWludCBteGNzciwgY29udHJvbCwgb21hc2s7CisKKwltYXNrICY9IEZFX0FMTF9FWENFUFQ7CisJX19mbnN0Y3coJmNvbnRyb2wpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZteGNzcik7CisJZWxzZQorCQlteGNzciA9IDA7CisJb21hc2sgPSAoY29udHJvbCB8IG14Y3NyID4+IF9TU0VfRU1BU0tfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVDsKKwljb250cm9sIHw9IG1hc2s7CisJX19mbGRjdyhjb250cm9sKTsKKwlpZiAoX19IQVNfU1NFKCkpIHsKKwkJbXhjc3IgfD0gbWFzayA8PCBfU1NFX0VNQVNLX1NISUZUOworCQlfX2xkbXhjc3IobXhjc3IpOworCX0KKwlyZXR1cm4gKH5vbWFzayk7Cit9CisKK19fd2Vha19yZWZlcmVuY2UoX19mZWVuYWJsZWV4Y2VwdCwgZmVlbmFibGVleGNlcHQpOworX193ZWFrX3JlZmVyZW5jZShfX2ZlZGlzYWJsZWV4Y2VwdCwgZmVkaXNhYmxlZXhjZXB0KTsKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9mZW52LmggYi9saWJtL2kzODcvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjQzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvZmVudi5oCkBAIC0wLDAgKzEsMjQwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L2ZlbnYuaCx2IDEuNCAyMDA1LzAzLzE3IDIyOjIxOjQ2IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKworLyogICAgICAgICAgICAgICAgICAgCisgKiBUbyBwcmVzZXJ2ZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIEZyZWVCU0QgNS4zLCB3ZSBwYWNrIHRoZQorICogbXhjc3IgaW50byBzb21lIHJlc2VydmVkIGZpZWxkcywgcmF0aGVyIHRoYW4gY2hhbmdpbmcgc2l6ZW9mKGZlbnZfdCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3VpbnQxNl90CV9fY29udHJvbDsKKwlfX3VpbnQxNl90ICAgICAgX19teGNzcl9oaTsKKwlfX3VpbnQxNl90CV9fc3RhdHVzOworCV9fdWludDE2X3QgICAgICBfX214Y3NyX2xvOworCV9fdWludDMyX3QJX190YWc7CisJY2hhcgkJX19vdGhlclsxNl07Cit9IGZlbnZfdDsKKworI2RlZmluZQlfX2dldF9teGNzcihlbnYpCSgoKGVudikuX19teGNzcl9oaSA8PCAxNikgfAlcCisJCQkJICgoZW52KS5fX214Y3NyX2xvKSkKKyNkZWZpbmUJX19zZXRfbXhjc3IoZW52LCB4KQlkbyB7CQkJCVwKKwkoZW52KS5fX214Y3NyX2hpID0gKF9fdWludDMyX3QpKHgpID4+IDE2OwkJXAorCShlbnYpLl9fbXhjc3JfbG8gPSAoX191aW50MTZfdCkoeCk7CQkJXAorfSB3aGlsZSAoMCkKKwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMQorI2RlZmluZQlGRV9ERU5PUk1BTAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0RFTk9STUFMIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgwNDAwCisjZGVmaW5lCUZFX1VQV0FSRAkweDA4MDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDBjMDAKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKKy8qCisgKiBBcyBjb21wYXJlZCB0byB0aGUgeDg3IGNvbnRyb2wgd29yZCwgdGhlIFNTRSB1bml0J3MgY29udHJvbCB3b3JkCisgKiBoYXMgdGhlIHJvdW5kaW5nIGNvbnRyb2wgYml0cyBvZmZzZXQgYnkgMyBhbmQgdGhlIGV4Y2VwdGlvbiBtYXNrCisgKiBiaXRzIG9mZnNldCBieSA3LgorICovCisjZGVmaW5lCV9TU0VfUk9VTkRfU0hJRlQJMworI2RlZmluZQlfU1NFX0VNQVNLX1NISUZUCTcKKworLyogQWZ0ZXIgdGVzdGluZyBmb3IgU1NFIHN1cHBvcnQgb25jZSwgd2UgY2FjaGUgdGhlIHJlc3VsdCBpbiBfX2hhc19zc2UuICovCitlbnVtIF9fc3NlX3N1cHBvcnQgeyBfX1NTRV9ZRVMsIF9fU1NFX05PLCBfX1NTRV9VTksgfTsKK2V4dGVybiBlbnVtIF9fc3NlX3N1cHBvcnQgX19oYXNfc3NlOworaW50IF9fdGVzdF9zc2Uodm9pZCk7CisjaWZkZWYgX19TU0VfXworI2RlZmluZQlfX0hBU19TU0UoKQkxCisjZWxzZQorI2RlZmluZQlfX0hBU19TU0UoKQkoX19oYXNfc3NlID09IF9fU1NFX1lFUyB8fAkJCVwKKwkJCSAoX19oYXNfc3NlID09IF9fU1NFX1VOSyAmJiBfX3Rlc3Rfc3NlKCkpKQorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKyNkZWZpbmUJX19mbGRjdyhfX2N3KQkJX19hc20gX192b2xhdGlsZSgiZmxkY3cgJTAiIDogOiAibSIgKF9fY3cpKQorI2RlZmluZQlfX2ZsZGVudihfX2VudikJCV9fYXNtIF9fdm9sYXRpbGUoImZsZGVudiAlMCIgOiA6ICJtIiAoX19lbnYpKQorI2RlZmluZQlfX2ZuY2xleCgpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbmNsZXgiKQorI2RlZmluZQlfX2Zuc3RlbnYoX19lbnYpCV9fYXNtIF9fdm9sYXRpbGUoImZuc3RlbnYgJTAiIDogIj1tIiAoKihfX2VudikpKQorI2RlZmluZQlfX2Zuc3RjdyhfX2N3KQkJX19hc20gX192b2xhdGlsZSgiZm5zdGN3ICUwIiA6ICI9bSIgKCooX19jdykpKQorI2RlZmluZQlfX2Zuc3RzdyhfX3N3KQkJX19hc20gX192b2xhdGlsZSgiZm5zdHN3ICUwIiA6ICI9YW0iICgqKF9fc3cpKSkKKyNkZWZpbmUJX19md2FpdCgpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmd2FpdCIpCisjZGVmaW5lCV9fbGRteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgibGRteGNzciAlMCIgOiA6ICJtIiAoX19jc3IpKQorI2RlZmluZQlfX3N0bXhjc3IoX19jc3IpCV9fYXNtIF9fdm9sYXRpbGUoInN0bXhjc3IgJTAiIDogIj1tIiAoKihfX2NzcikpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZW52OworCWludCBfX214Y3NyOworCisJaWYgKF9fZXhjZXB0cyA9PSBGRV9BTExfRVhDRVBUKSB7CisJCV9fZm5jbGV4KCk7CisJfSBlbHNlIHsKKwkJX19mbnN0ZW52KCZfX2Vudik7CisJCV9fZW52Ll9fc3RhdHVzICY9IH5fX2V4Y2VwdHM7CisJCV9fZmxkZW52KF9fZW52KTsKKwl9CisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCV9fc3RteGNzcigmX19teGNzcik7CisJCV9fbXhjc3IgJj0gfl9fZXhjZXB0czsKKwkJX19sZG14Y3NyKF9fbXhjc3IpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWludCBfX214Y3NyLCBfX3N0YXR1czsKKworCV9fZm5zdHN3KCZfX3N0YXR1cyk7CisJaWYgKF9fSEFTX1NTRSgpKQorCQlfX3N0bXhjc3IoJl9fbXhjc3IpOworCWVsc2UKKwkJX19teGNzciA9IDA7CisJKl9fZmxhZ3AgPSAoX19teGNzciB8IF9fc3RhdHVzKSAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cyk7CitpbnQgZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19mbnN0c3coJl9fc3RhdHVzKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmX19teGNzcik7CisJZWxzZQorCQlfX214Y3NyID0gMDsKKwlyZXR1cm4gKChfX3N0YXR1cyB8IF9fbXhjc3IpICYgX19leGNlcHRzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWludCBfX2NvbnRyb2w7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSB4ODcgYW5kIHRoZSBTU0UgdW5pdCBhZ3JlZSBvbiB0aGUKKwkgKiByb3VuZGluZyBtb2RlLiAgUmVhZGluZyB0aGUgY29udHJvbCB3b3JkIG9uIHRoZSB4ODcgdHVybnMKKwkgKiBvdXQgdG8gYmUgYWJvdXQgNSB0aW1lcyBmYXN0ZXIgdGhhbiByZWFkaW5nIGl0IG9uIHRoZSBTU0UKKwkgKiB1bml0IG9uIGFuIE9wdGVyb24gMjQ0LgorCSAqLworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCXJldHVybiAoX19jb250cm9sICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWludCBfX214Y3NyLCBfX2NvbnRyb2w7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisKKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlfX2NvbnRyb2wgJj0gfl9ST1VORF9NQVNLOworCV9fY29udHJvbCB8PSBfX3JvdW5kOworCV9fZmxkY3coX19jb250cm9sKTsKKworCWlmIChfX0hBU19TU0UoKSkgeworCQlfX3N0bXhjc3IoJl9fbXhjc3IpOworCQlfX214Y3NyICY9IH4oX1JPVU5EX01BU0sgPDwgX1NTRV9ST1VORF9TSElGVCk7CisJCV9fbXhjc3IgfD0gX19yb3VuZCA8PCBfU1NFX1JPVU5EX1NISUZUOworCQlfX2xkbXhjc3IoX19teGNzcik7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworaW50IGZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKTsKK2ludCBmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19lbnYgPSAqX19lbnZwOworCWludCBfX214Y3NyOworCisJX19teGNzciA9IF9fZ2V0X214Y3NyKF9fZW52KTsKKwlfX3NldF9teGNzcihfX2VudiwgMHhmZmZmZmZmZik7CisJX19mbGRlbnYoX19lbnYpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19sZG14Y3NyKF9fbXhjc3IpOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK2ludCBmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludCBmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzayk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIG1hc2tzIGZvciB0aGUgeDg3IGFuZCB0aGUgU1NFIHVuaXQgYXJlCisJICogdGhlIHNhbWUuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuICh+X19jb250cm9sICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9ucHguaCBiL2xpYm0vaTM4Ny9ucHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMyYWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L25weC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBXaWxsaWFtIEpvbGl0ei4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbTogQCgjKW5weC5oCTUuMyAoQmVya2VsZXkpIDEvMTgvOTEKKyAqICRGcmVlQlNEOiBzcmMvc3lzL2kzODYvaW5jbHVkZS9ucHguaCx2IDEuMjkuMi4xIDIwMDYvMDcvMDEgMDA6NTc6NTUgZGF2aWR4dSBFeHAgJAorICovCisKKy8qCisgKiAyODcvMzg3IE5QWCBDb3Byb2Nlc3NvciBEYXRhIFN0cnVjdHVyZXMgYW5kIENvbnN0YW50cworICogVy4gSm9saXR6IDEvOTAKKyAqLworCisjaWZuZGVmIF9NQUNISU5FX05QWF9IXworI2RlZmluZQlfTUFDSElORV9OUFhfSF8KKworLyogRW52aXJvbm1lbnQgaW5mb3JtYXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgdW5pdCAqLworc3RydWN0IGVudjg3IHsKKwlsb25nCWVuX2N3OwkJLyogY29udHJvbCB3b3JkICgxNmJpdHMpICovCisJbG9uZwllbl9zdzsJCS8qIHN0YXR1cyB3b3JkICgxNmJpdHMpICovCisJbG9uZwllbl90dzsJCS8qIHRhZyB3b3JkICgxNmJpdHMpICovCisJbG9uZwllbl9maXA7CQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiBwb2ludGVyICovCisJdV9zaG9ydAllbl9mY3M7CQkvKiBmbG9hdGluZyBjb2RlIHNlZ21lbnQgc2VsZWN0b3IgKi8KKwl1X3Nob3J0CWVuX29wY29kZTsJLyogb3Bjb2RlIGxhc3QgZXhlY3V0ZWQgKDExIGJpdHMgKSAqLworCWxvbmcJZW5fZm9vOwkJLyogZmxvYXRpbmcgb3BlcmFuZCBvZmZzZXQgKi8KKwlsb25nCWVuX2ZvczsJCS8qIGZsb2F0aW5nIG9wZXJhbmQgc2VnbWVudCBzZWxlY3RvciAqLworfTsKKworLyogQ29udGVudHMgb2YgZWFjaCBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciAqLworc3RydWN0IGZwYWNjODcgeworI2lmZGVmIGRvbnRkZWYgLyogdG9vIHVucG9ydGFibGUgKi8KKwl1X2xvbmcJZnBfbWFudGxvOwkvKiBtYW50aXNzYSBsb3cgKDMxOjApICovCisJdV9sb25nCWZwX21hbnRoaTsJLyogbWFudGlzc2EgaGlnaCAoNjM6MzIpICovCisJaW50CWZwX2V4cDoxNTsJLyogZXhwb25lbnQgKi8KKwlpbnQJZnBfc2duOjE7CS8qIG1hbnRpc3NhIHNpZ24gKi8KKyNlbHNlCisJdV9jaGFyCWZwX2J5dGVzWzEwXTsKKyNlbmRpZgorfTsKKworLyogRmxvYXRpbmcgcG9pbnQgY29udGV4dCAqLworc3RydWN0IHNhdmU4NyB7CisJc3RydWN0CWVudjg3IHN2X2VudjsJLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbC9zdGF0dXMgKi8KKwlzdHJ1Y3QJZnBhY2M4Nwlzdl9hY1s4XTsJLyogYWNjdW11bGF0b3IgY29udGVudHMsIDAtNyAqLworCXVfY2hhcglzdl9wYWQwWzRdOwkvKiBwYWRkaW5nIGZvciAobm93IHVudXNlZCkgc2F2ZWQgc3RhdHVzIHdvcmQgKi8KKwkvKgorCSAqIEJvZ3VzIHBhZGRpbmcgZm9yIGVtdWxhdG9ycy4gIEVtdWxhdG9ycyBzaG91bGQgdXNlIHRoZWlyIG93bgorCSAqIHN0cnVjdCBhbmQgYXJyYW5nZSB0byBzdG9yZSBpbnRvIHRoaXMgc3RydWN0IChlbmRpbmcgaGVyZSkKKwkgKiBiZWZvcmUgaXQgaXMgaW5zcGVjdGVkIGZvciBwdHJhY2luZyBvciBmb3IgY29yZSBkdW1wcy4gIFNvbWUKKwkgKiBlbXVsYXRvcnMgb3ZlcndyaXRlIHRoZSB3aG9sZSBzdHJ1Y3QuICBXZSBoYXZlIG5vIGdvb2Qgd2F5IG9mCisJICoga25vd2luZyBob3cgbXVjaCBwYWRkaW5nIHRvIGxlYXZlLiAgTGVhdmUganVzdCBlbm91Z2ggZm9yIHRoZQorCSAqIEdQTCBlbXVsYXRvcidzIGkzODdfdW5pb24gKDE3NiBieXRlcyB0b3RhbCkuCisJICovCisJdV9jaGFyCXN2X3BhZFs2NF07CS8qIHBhZGRpbmc7IHVzZWQgYnkgZW11bGF0b3JzICovCit9OworCitzdHJ1Y3QgIGVudnhtbSB7CisJdV9pbnQxNl90CWVuX2N3OwkJLyogY29udHJvbCB3b3JkICgxNmJpdHMpICovCisJdV9pbnQxNl90CWVuX3N3OwkJLyogc3RhdHVzIHdvcmQgKDE2Yml0cykgKi8KKwl1X2ludDE2X3QJZW5fdHc7CQkvKiB0YWcgd29yZCAoMTZiaXRzKSAqLworCXVfaW50MTZfdAllbl9vcGNvZGU7CS8qIG9wY29kZSBsYXN0IGV4ZWN1dGVkICgxMSBiaXRzICkgKi8KKwl1X2ludDMyX3QJZW5fZmlwOwkJLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLworCXVfaW50MTZfdAllbl9mY3M7CQkvKiBmbG9hdGluZyBjb2RlIHNlZ21lbnQgc2VsZWN0b3IgKi8KKwl1X2ludDE2X3QJZW5fcGFkMDsJLyogcGFkZGluZyAqLworCXVfaW50MzJfdAllbl9mb287CQkvKiBmbG9hdGluZyBvcGVyYW5kIG9mZnNldCAqLworCXVfaW50MTZfdAllbl9mb3M7CQkvKiBmbG9hdGluZyBvcGVyYW5kIHNlZ21lbnQgc2VsZWN0b3IgKi8KKwl1X2ludDE2X3QJZW5fcGFkMTsJLyogcGFkZGluZyAqLworCXVfaW50MzJfdAllbl9teGNzcjsJLyogU1NFIHNvbnRvcm9sL3N0YXR1cyByZWdpc3RlciAqLworCXVfaW50MzJfdAllbl9teGNzcl9tYXNrOwkvKiB2YWxpZCBiaXRzIGluIG14Y3NyICovCit9OworCisvKiBDb250ZW50cyBvZiBlYWNoIFNTRSBleHRlbmRlZCBhY2N1bXVsYXRvciAqLworc3RydWN0ICB4bW1hY2MgeworCXVfY2hhcgl4bW1fYnl0ZXNbMTZdOworfTsKKworc3RydWN0ICBzYXZleG1tIHsKKwlzdHJ1Y3QJZW52eG1tCXN2X2VudjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZnBhY2M4NwlmcF9hY2M7CisJCXVfY2hhcgkJZnBfcGFkWzZdOyAgICAgIC8qIHBhZGRpbmcgKi8KKwl9IHN2X2ZwWzhdOworCXN0cnVjdCB4bW1hY2MJc3ZfeG1tWzhdOworCXVfY2hhciBzdl9wYWRbMjI0XTsKK30gX19hbGlnbmVkKDE2KTsKKwordW5pb24Jc2F2ZWZwdSB7CisJc3RydWN0CXNhdmU4Nwlzdl84NzsKKwlzdHJ1Y3QJc2F2ZXhtbQlzdl94bW07Cit9OworCisvKgorICogVGhlIGhhcmR3YXJlIGRlZmF1bHQgY29udHJvbCB3b3JkIGZvciBpMzg3J3MgYW5kIGxhdGVyIGNvcHJvY2Vzc29ycyBpcworICogMHgzN0YsIGdpdmluZzoKKyAqCisgKglyb3VuZCB0byBuZWFyZXN0CisgKgk2NC1iaXQgcHJlY2lzaW9uCisgKglhbGwgZXhjZXB0aW9ucyBtYXNrZWQuCisgKgorICogV2UgbW9kaWZ5IHRoZSBhZmZpbmUgbW9kZSBiaXQgYW5kIHByZWNpc2lvbiBiaXRzIGluIHRoaXMgdG8gZ2l2ZToKKyAqCisgKglhZmZpbmUgbW9kZSBmb3IgMjg3J3MgKGlmIHRoZXkgd29yayBhdCBhbGwpICgxIGluIGJpdGZpZWxkIDE8PDEyKQorICoJNTMtYml0IHByZWNpc2lvbiAoMiBpbiBiaXRmaWVsZCAzPDw4KQorICoKKyAqIDY0LWJpdCBwcmVjaXNpb24gb2Z0ZW4gZ2l2ZXMgYmFkIHJlc3VsdHMgd2l0aCBoaWdoIGxldmVsIGxhbmd1YWdlcworICogYmVjYXVzZSBpdCBtYWtlcyB0aGUgcmVzdWx0cyBvZiBjYWxjdWxhdGlvbnMgZGVwZW5kIG9uIHdoZXRoZXIKKyAqIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBtZW1vcnkgb3IgaW4gRlBVIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZQlfX0lOSVRJQUxfTlBYQ1dfXwkweDEyN0YKKyNkZWZpbmUJX19JTklUSUFMX01YQ1NSX18JMHgxRjgwCisKKyNpZmRlZiBfS0VSTkVMCisKKyNkZWZpbmUJSU9fTlBYCQkweDBGMAkJLyogTnVtZXJpYyBDb3Byb2Nlc3NvciAqLworI2RlZmluZQlJT19OUFhTSVpFCTE2CQkvKiA4MDM4Ny84MDQ4NyBOUFggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUJSVJRX05QWAkJMTMKKworLyogZnVsbCByZXNldCBvbiBzb21lIHN5c3RlbXMsIE5PUCBvbiBvdGhlcnMgKi8KKyNkZWZpbmUgbnB4X2Z1bGxfcmVzZXQoKSBvdXRiKElPX05QWCArIDEsIDApCisKK2ludAlucHhkbmEodm9pZCk7Cit2b2lkCW5weGRyb3Aodm9pZCk7Cit2b2lkCW5weGV4aXQoc3RydWN0IHRocmVhZCAqdGQpOworaW50CW5weGZvcm1hdCh2b2lkKTsKK2ludAlucHhnZXRyZWdzKHN0cnVjdCB0aHJlYWQgKnRkLCB1bmlvbiBzYXZlZnB1ICphZGRyKTsKK3ZvaWQJbnB4aW5pdCh1X3Nob3J0IGNvbnRyb2wpOwordm9pZAlucHhzYXZlKHVuaW9uIHNhdmVmcHUgKmFkZHIpOwordm9pZAlucHhzZXRyZWdzKHN0cnVjdCB0aHJlYWQgKnRkLCB1bmlvbiBzYXZlZnB1ICphZGRyKTsKK2ludAlucHh0cmFwKHZvaWQpOworI2VuZGlmCisKKyNlbmRpZiAvKiAhX01BQ0hJTkVfTlBYX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jZWlsLlMgYi9saWJtL2kzODcvc19jZWlsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3M2IzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2NlaWwuUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19jZWlsLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMSBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGNlaWwpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDA4MDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzICtvbyAqLworCWFuZHcJJDB4ZmJmZiwlZHgKKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGRsCTgoJWVicCk7CQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2NlaWxmLlMgYi9saWJtL2kzODcvc19jZWlsZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmNhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19jZWlsZi5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2NlaWxmLlMsdiAxLjIgMjAwNS8wNS8wNiAxNTo0NDoyMCBkZWlzY2hlbiBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfY2VpbGYuUyx2IDEuMyAxOTk1LzA1LzA4IDIzOjUyOjQ0IGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGNlaWxmKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwODAwLCVkeAkJLyogcm91bmQgdG93YXJkcyArb28gKi8KKwlhbmR3CSQweGZiZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkcwk4KCVlYnApOwkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jZWlsbC5TIGIvbGlibS9pMzg3L3NfY2VpbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmMzYzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY2VpbGwuUwpAQCAtMCwwICsxLDI3IEBACisvKgorICogQmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQE5ldEJTRC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCQorI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfY2VpbGwuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisKK0VOVFJZKGNlaWxsKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwODAwLCVkeAkJLyogcm91bmQgdG93YXJkcyArb28gKi8KKwlhbmR3CSQweGZiZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkdAk4KCVlYnApCQkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jb3B5c2lnbi5TIGIvbGlibS9pMzg3L3NfY29weXNpZ24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNjNzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY29weXNpZ24uUwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2NvcHlzaWduLlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxMSBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGNvcHlzaWduKQorCW1vdmwJMTYoJWVzcCksJWVkeAorCWFuZGwJJDB4ODAwMDAwMDAsJWVkeAorCW1vdmwJOCglZXNwKSwlZWF4CisJYW5kbAkkMHg3ZmZmZmZmZiwlZWF4CisJb3JsCSVlZHgsJWVheAorCW1vdmwJJWVheCw4KCVlc3ApCisJZmxkbAk0KCVlc3ApCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19jb3B5c2lnbmYuUyBiL2xpYm0vaTM4Ny9zX2NvcHlzaWduZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmM4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19jb3B5c2lnbmYuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19jb3B5c2lnbmYuUyx2IDEuMSAyMDA1LzAxLzEzIDE4OjU4OjI1IGRhcyBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfY29weXNpZ25mLlMsdiAxLjMgMTk5NS8wNS8wOCAyMzo1MzoyNSBqdGMgRXhwICQiKSAqLworCitFTlRSWShjb3B5c2lnbmYpCisJbW92bAk4KCVlc3ApLCVlZHgKKwlhbmRsCSQweDgwMDAwMDAwLCVlZHgKKwltb3ZsCTQoJWVzcCksJWVheAorCWFuZGwJJDB4N2ZmZmZmZmYsJWVheAorCW9ybAklZWR4LCVlYXgKKwltb3ZsCSVlYXgsNCglZXNwKQorCWZsZHMJNCglZXNwKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfY29weXNpZ25sLlMgYi9saWJtL2kzODcvc19jb3B5c2lnbmwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNhMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfY29weXNpZ25sLlMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfY29weXNpZ25sLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWShjb3B5c2lnbmwpCisJbW92bAkyNCglZXNwKSwlZWR4CisJYW5kbAkkMHg4MDAwLCVlZHgKKwltb3ZsCTEyKCVlc3ApLCVlYXgKKwlhbmRsCSQweDdmZmYsJWVheAorCW9ybAklZWR4LCVlYXgKKwltb3ZsCSVlYXgsMTIoJWVzcCkKKwlmbGR0CTQoJWVzcCkKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Nvcy5TIGIvbGlibS9pMzg3L3NfY29zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4Y2I3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2Nvcy5TCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2Nvcy5TLHYgMS42IDE5OTkvMDgvMjggMDA6MDY6MTIgcGV0ZXIgRXhwICQiKQorCitFTlRSWShjb3MpCisJZmxkbAk0KCVlc3ApCisJZmNvcworCWZuc3RzdwklYXgKKwlhbmR3CSQweDQwMCwlYXgKKwlqbnoJMWYKKwlyZXQJCisxOglmbGRwaQorCWZhZGQJJXN0KDApCisJZnhjaAklc3QoMSkKKzI6CWZwcmVtMQorCWZuc3RzdwklYXgKKwlhbmR3CSQweDQwMCwlYXgKKwlqbnoJMmIKKwlmc3RwCSVzdCgxKQorCWZjb3MKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Zpbml0ZS5TIGIvbGlibS9pMzg3L3NfZmluaXRlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzNWIwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2Zpbml0ZS5TCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfZmluaXRlLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMiBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGZpbml0ZSkKKwltb3ZsCTgoJWVzcCksJWVheAorCWFuZGwJJDB4N2ZmMDAwMDAsICVlYXgKKwljbXBsCSQweDdmZjAwMDAwLCAlZWF4CisJc2V0bmViCSVhbAorCWFuZGwJJDB4MDAwMDAwZmYsICVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2Zsb29yLlMgYi9saWJtL2kzODcvc19mbG9vci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMmY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19mbG9vci5TCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2Zsb29yLlMsdiAxLjcgMTk5OS8wOC8yOCAwMDowNjoxMiBwZXRlciBFeHAgJCIpCisKK0VOVFJZKGZsb29yKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwNDAwLCVkeAkJLyogcm91bmQgdG93YXJkcyAtb28gKi8KKwlhbmR3CSQweGY3ZmYsJWR4CisJbW92dwklZHgsLTgoJWVicCkKKwlmbGRjdwktOCglZWJwKQkJLyogbG9hZCBtb2RmaWVkIGNvbnRyb2wgd29yZCAqLworCisJZmxkbAk4KCVlYnApOwkJLyogcm91bmQgKi8KKwlmcm5kaW50CisKKwlmbGRjdwktNCglZWJwKQkJLyogcmVzdG9yZSBvcmlnaW5hbCBjb250cm9sIHdvcmQgKi8KKworCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19mbG9vcmYuUyBiL2xpYm0vaTM4Ny9zX2Zsb29yZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzlhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19mbG9vcmYuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19mbG9vcmYuUyx2IDEuMiAyMDA1LzA1LzA2IDE1OjQ0OjIwIGRlaXNjaGVuIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogc19mbG9vcmYuUyx2IDEuMyAxOTk1LzA1LzA5IDAwOjA0OjMyIGp0YyBFeHAgJCIpICovCisKK0VOVFJZKGZsb29yZikKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlzdWJsCSQ4LCVlc3AKKworCWZzdGN3CS00KCVlYnApCQkvKiBzdG9yZSBmcHUgY29udHJvbCB3b3JkICovCisJbW92dwktNCglZWJwKSwlZHgKKwlvcncJJDB4MDQwMCwlZHgJCS8qIHJvdW5kIHRvd2FyZHMgLW9vICovCisJYW5kdwkkMHhmN2ZmLCVkeAorCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHMJOCglZWJwKTsJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfZmxvb3JsLlMgYi9saWJtL2kzODcvc19mbG9vcmwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RlMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfZmxvb3JsLlMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfZmxvb3JsLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWShmbG9vcmwpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDA0MDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCWFuZHcJJDB4ZjdmZiwlZHgKKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGR0CTgoJWVicCkJCQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xscmludC5TIGIvbGlibS9pMzg3L3NfbGxyaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NmU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2xscmludC5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbGxyaW50LlMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMDo1MyBkYXMgRXhwICQiKTsgCisJCitFTlRSWShsbHJpbnQpCisJZmxkbAk0KCVlc3ApCisJc3VibAkkOCwlZXNwCisJZmlzdHBsbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xscmludGYuUyBiL2xpYm0vaTM4Ny9zX2xscmludGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVkYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfbGxyaW50Zi5TCkBAIC0wLDAgKzEsMzYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbGxyaW50Zi5TLHYgMS4xIDIwMDUvMDQvMTYgMjE6MTI6NTUgZGFzIEV4cCAkIikKKwkKK0VOVFJZKGxscmludGYpCisJZmxkcwk0KCVlc3ApCisJc3VibAkkOCwlZXNwCisJZmlzdHBsbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xvZ2IuUyBiL2xpYm0vaTM4Ny9zX2xvZ2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y4ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfbG9nYi5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbG9nYi5TLHYgMS43IDIwMDAvMDYvMDYgMTI6MTI6MzYgYmRlIEV4cCAkIikKKworRU5UUlkobG9nYikKKwlmbGRsCTQoJWVzcCkKKwlmeHRyYWN0CisJZnN0cAklc3QKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xvZ2JmLlMgYi9saWJtL2kzODcvc19sb2diZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmM0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19sb2diZi5TCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiA8anRjQG5ldGJzZC5vcmc+LgorICogUHVibGljIGRvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX2xvZ2JmLlMsdiAxLjEgMjAwNS8wMS8xMyAxODo1ODoyNSBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX2xvZ2JmLlMsdiAxLjMgMTk5NS8wNS8wOSAwMDoxNToxMiBqdGMgRXhwICQiKSAqLworCitFTlRSWShsb2diZikKKwlmbGRzCTQoJWVzcCkKKwlmeHRyYWN0CisJZnN0cAklc3QKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xyaW50LlMgYi9saWJtL2kzODcvc19scmludC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjc4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19scmludC5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbHJpbnQuUyx2IDEuMSAyMDA1LzAxLzExIDIzOjEwOjUzIGRhcyBFeHAgJCIpOyAKKwkKK0VOVFJZKGxyaW50KQorCWZsZGwJNCglZXNwKQorCXN1YmwJJDQsJWVzcAorCWZpc3RwbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX2xyaW50Zi5TIGIvbGlibS9pMzg3L3NfbHJpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX2xyaW50Zi5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfbHJpbnRmLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCQorRU5UUlkobHJpbnRmKQorCWZsZHMJNCglZXNwKQorCXN1YmwJJDQsJWVzcAorCWZpc3RwbAkoJWVzcCkKKwlwb3BsCSVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3JlbXF1by5TIGIvbGlibS9pMzg3L3NfcmVtcXVvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1MjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JlbXF1by5TCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIHB1YmxpYy1kb21haW4gcmVtYWluZGVyIHJvdXRpbmUgYnkgSi5ULiBDb25rbGluIDxqdGNATmV0QlNELm9yZz4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfcmVtcXVvLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW8pCisJZmxkbAkxMiglZXNwKQorCWZsZGwJNCglZXNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKy8qIEV4dHJhY3QgdGhlIHRocmVlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBxdW90aWVudCBmcm9tIEMwLEMzLEMxLiAqLworCXNocmwJJDYsJWVheAorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgxMDgsJWVheAorCXJvcmwJJDcsJWVheAorCW9ybAklZWF4LCVlY3gKKwlyb2xsCSQ0LCVlYXgKKwlvcmwJJWVjeCwlZWF4CisJYW5kbAkkNywlZWF4CisvKiBOZWdhdGUgdGhlIHF1b3RpZW50IGJpdHMgaWYgeCp5PDAuICBBdm9pZCB1c2luZyBhbiB1bnByZWRpY3RhYmxlIGJyYW5jaC4gKi8KKwltb3ZsCTE2KCVlc3ApLCVlY3gKKwl4b3JsCTgoJWVzcCksJWVjeAorCXNhcmwJJDE2LCVlY3gKKwlzYXJsCSQxNiwlZWN4CisJeG9ybAklZWN4LCVlYXgKKwlhbmRsCSQxLCVlY3gKKwlhZGRsCSVlY3gsJWVheAorLyogU3RvcmUgdGhlIHF1b3RpZW50IGFuZCByZXR1cm4uICovCisJbW92bAkyMCglZXNwKSwlZWN4CisJbW92bAklZWF4LCglZWN4KQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfcmVtcXVvZi5TIGIvbGlibS9pMzg3L3NfcmVtcXVvZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19yZW1xdW9mLlMKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQmFzZWQgb24gcHVibGljLWRvbWFpbiByZW1haW5kZXIgcm91dGluZSBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19yZW1xdW9mLlMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgCisJCitFTlRSWShyZW1xdW9mKQorCWZsZHMJOCglZXNwKQorCWZsZHMJNCglZXNwKQorMToJZnByZW0xCisJZnN0c3cJJWF4CisJc2FoZgorCWpwCTFiCisJZnN0cAklc3QoMSkKKy8qIEV4dHJhY3QgdGhlIHRocmVlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSBxdW90aWVudCBmcm9tIEMwLEMzLEMxLiAqLworCXNocmwJJDYsJWVheAorCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgxMDgsJWVheAorCXJvcmwJJDcsJWVheAorCW9ybAklZWF4LCVlY3gKKwlyb2xsCSQ0LCVlYXgKKwlvcmwJJWVjeCwlZWF4CisJYW5kbAkkNywlZWF4CisvKiBOZWdhdGUgdGhlIHF1b3RpZW50IGJpdHMgaWYgeCp5PDAuICBBdm9pZCB1c2luZyBhbiB1bnByZWRpY3RhYmxlIGJyYW5jaC4gKi8KKwltb3ZsCTgoJWVzcCksJWVjeAorCXhvcmwJNCglZXNwKSwlZWN4CisJc2FybAkkMTYsJWVjeAorCXNhcmwJJDE2LCVlY3gKKwl4b3JsCSVlY3gsJWVheAorCWFuZGwJJDEsJWVjeAorCWFkZGwJJWVjeCwlZWF4CisvKiBTdG9yZSB0aGUgcXVvdGllbnQgYW5kIHJldHVybi4gKi8KKwltb3ZsCTEyKCVlc3ApLCVlY3gKKwltb3ZsCSVlYXgsKCVlY3gpCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19yaW50LlMgYi9saWJtL2kzODcvc19yaW50LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYTMxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JpbnQuUwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19yaW50LlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxMyBwZXRlciBFeHAgJCIpCisKK0VOVFJZKHJpbnQpCisJZmxkbAk0KCVlc3ApCisJZnJuZGludAorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfcmludGYuUyBiL2xpYm0vaTM4Ny9zX3JpbnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0NTI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3JpbnRmLlMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfcmludGYuUyx2IDEuMSAyMDA1LzAxLzEzIDE4OjU4OjI1IGRhcyBFeHAgJCIpOworLyogUkNTSUQoIiROZXRCU0Q6IHNfcmludGYuUyx2IDEuMyAxOTk1LzA1LzA5IDAwOjE3OjIyIGp0YyBFeHAgJCIpICovCisKK0VOVFJZKHJpbnRmKQorCWZsZHMJNCglZXNwKQorCWZybmRpbnQKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3NjYWxibi5TIGIvbGlibS9pMzg3L3Nfc2NhbGJuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMDYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3NjYWxibi5TCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogV3JpdHRlbiBieToKKyAqCUouVC4gQ29ua2xpbiAoanRjQHdpbXNleS5jb20pLCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworUkNTSUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX3NjYWxibi5TLHYgMS43IDE5OTkvMDgvMjggMDA6MDY6MTMgcGV0ZXIgRXhwICQiKQorCitFTlRSWShzY2FsYm4pCisJZmlsZGwJMTIoJWVzcCkKKwlmbGRsCTQoJWVzcCkKKwlmc2NhbGUKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2NhbGJuZi5TIGIvbGlibS9pMzg3L3Nfc2NhbGJuZi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWFjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19zY2FsYm5mLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2NhbGJuZi5TLHYgMS4yIDIwMDUvMDMvMDcgMDQ6NTI6NDMgZGFzIEV4cCAkIik7CisvKiBSQ1NJRCgiJE5ldEJTRDogc19zY2FsYm5mLlMsdiAxLjQgMTk5OS8wMS8wMiAwNToxNTo0MCBrcmlzdGVydyBFeHAgJCIpICovCisKK0VOVFJZKHNjYWxibmYpCisJZmlsZGwJOCglZXNwKQorCWZsZHMJNCglZXNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCQkvKiBidWcgZml4IGZvciBmcCBzdGFjayBvdmVyZmxvdyAqLworCXJldAorCisuZ2xvYmwgQ05BTUUobGRleHBmKQorLnNldAlDTkFNRShsZGV4cGYpLENOQU1FKHNjYWxibmYpCmRpZmYgLS1naXQgYS9saWJtL2kzODcvc19zY2FsYm5sLlMgYi9saWJtL2kzODcvc19zY2FsYm5sLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3NjYWxibmwuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc19zY2FsYm5sLlMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Mjo1NyBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX3NjYWxibmYuUyx2IDEuNCAxOTk5LzAxLzAyIDA1OjE1OjQwIGtyaXN0ZXJ3IEV4cCAkIikgKi8KKworRU5UUlkoc2NhbGJubCkKKwlmaWxkbAkxNiglZXNwKQorCWZsZHQJNCglZXNwKQorCWZzY2FsZQorCWZzdHAJJXN0KDEpCisJcmV0CisKKy5nbG9ibCBDTkFNRShsZGV4cGwpCisuc2V0CUNOQU1FKGxkZXhwbCksQ05BTUUoc2NhbGJubCkKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3NpZ25pZmljYW5kLlMgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGJjODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZC5TCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsOTQgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2lnbmlmaWNhbmQuUyx2IDEuNyAyMDAwLzA2LzA2IDEyOjEyOjM2IGJkZSBFeHAgJCIpCisKK0VOVFJZKHNpZ25pZmljYW5kKQorCWZsZGwJNCglZXNwKQorCWZ4dHJhY3QKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMgYi9saWJtL2kzODcvc19zaWduaWZpY2FuZGYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk2ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNAbmV0YnNkLm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2lnbmlmaWNhbmRmLlMsdiAxLjEgMjAwNS8wMS8xMyAxODo1ODoyNSBkYXMgRXhwICQiKTsKKy8qIFJDU0lEKCIkTmV0QlNEOiBzX3NpZ25pZmljYW5kZi5TLHYgMS4zIDE5OTUvMDUvMDkgMDA6MjQ6MDcganRjIEV4cCAkIikgKi8KKworRU5UUlkoc2lnbmlmaWNhbmRmKQorCWZsZHMJNCglZXNwKQorCWZ4dHJhY3QKKwlmc3RwCSVzdCgxKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3Nfc2luLlMgYi9saWJtL2kzODcvc19zaW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q2NWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3Nfc2luLlMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBXaW5uaW5nIFN0cmF0ZWdpZXMsIEluYy4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBXcml0dGVuIGJ5OgorICoJSi5ULiBDb25rbGluIChqdGNAd2ltc2V5LmNvbSksIFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitSQ1NJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3Nfc2luLlMsdiAxLjYgMTk5OS8wOC8yOCAwMDowNjoxNCBwZXRlciBFeHAgJCIpCisKK0VOVFJZKHNpbikKKwlmbGRsCTQoJWVzcCkKKwlmc2luCisJZm5zdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkxZgorCXJldAorMToJZmxkcGkKKwlmYWRkCSVzdCgwKQorCWZ4Y2gJJXN0KDEpCisyOglmcHJlbTEKKwlmbnN0c3cJJWF4CisJYW5kdwkkMHg0MDAsJWF4CisJam56CTJiCisJZnN0cAklc3QoMSkKKwlmc2luCisJcmV0CmRpZmYgLS1naXQgYS9saWJtL2kzODcvc190YW4uUyBiL2xpYm0vaTM4Ny9zX3Rhbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWUxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2kzODcvc190YW4uUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFdpbm5pbmcgU3RyYXRlZ2llcywgSW5jLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnk6CisgKglKLlQuIENvbmtsaW4gKGp0Y0B3aW1zZXkuY29tKSwgV2lubmluZyBTdHJhdGVnaWVzLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK1JDU0lEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvc190YW4uUyx2IDEuNiAxOTk5LzA4LzI4IDAwOjA2OjE0IHBldGVyIEV4cCAkIikKKworRU5UUlkodGFuKQorCWZsZGwJNCglZXNwKQorCWZwdGFuCisJZm5zdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkxZgorCWZzdHAJJXN0KDApCisJcmV0CisxOglmbGRwaQorCWZhZGQJJXN0KDApCisJZnhjaAklc3QoMSkKKzI6CWZwcmVtMQorCWZzdHN3CSVheAorCWFuZHcJJDB4NDAwLCVheAorCWpuegkyYgorCWZzdHAJJXN0KDEpCisJZnB0YW4KKwlmc3RwCSVzdCgwKQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfdHJ1bmMuUyBiL2xpYm0vaTM4Ny9zX3RydW5jLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3OGUxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3RydW5jLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfdHJ1bmMuUyx2IDEuMSAyMDA1LzA0LzE2IDIxOjEyOjU1IGRhcyBFeHAgJCIpCisKK0VOVFJZKHRydW5jKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXN1YmwJJDgsJWVzcAorCisJZnN0Y3cJLTQoJWVicCkJCS8qIHN0b3JlIGZwdSBjb250cm9sIHdvcmQgKi8KKwltb3Z3CS00KCVlYnApLCVkeAorCW9ydwkkMHgwYzAwLCVkeAkJLyogcm91bmQgdG93YXJkcyAtb28gKi8KKwltb3Z3CSVkeCwtOCglZWJwKQorCWZsZGN3CS04KCVlYnApCQkvKiBsb2FkIG1vZGZpZWQgY29udHJvbCB3b3JkICovCisKKwlmbGRsCTgoJWVicCkJCQkvKiByb3VuZCAqLworCWZybmRpbnQKKworCWZsZGN3CS00KCVlYnApCQkvKiByZXN0b3JlIG9yaWdpbmFsIGNvbnRyb2wgd29yZCAqLworCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2xpYm0vaTM4Ny9zX3RydW5jZi5TIGIvbGlibS9pMzg3L3NfdHJ1bmNmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmYWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaTM4Ny9zX3RydW5jZi5TCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgSi5ULiBDb25rbGluIDxqdGNATmV0QlNELm9yZz4uCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaTM4Ny9zX3RydW5jZi5TLHYgMS4yIDIwMDUvMDUvMDYgMTU6NDQ6MjAgZGVpc2NoZW4gRXhwICQiKQorCitFTlRSWSh0cnVuY2YpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDBjMDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHMJOCglZWJwKQkJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pMzg3L3NfdHJ1bmNsLlMgYi9saWJtL2kzODcvc190cnVuY2wuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDVkZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pMzg3L3NfdHJ1bmNsLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BOZXRCU0Qub3JnPi4KKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pMzg3L3NfdHJ1bmNsLlMsdiAxLjEgMjAwNS8wNC8xNiAyMToxMjo1NSBkYXMgRXhwICQiKQorCitFTlRSWSh0cnVuY2wpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkOCwlZXNwCisKKwlmc3RjdwktNCglZWJwKQkJLyogc3RvcmUgZnB1IGNvbnRyb2wgd29yZCAqLworCW1vdncJLTQoJWVicCksJWR4CisJb3J3CSQweDBjMDAsJWR4CQkvKiByb3VuZCB0b3dhcmRzIC1vbyAqLworCW1vdncJJWR4LC04KCVlYnApCisJZmxkY3cJLTgoJWVicCkJCS8qIGxvYWQgbW9kZmllZCBjb250cm9sIHdvcmQgKi8KKworCWZsZHQJOCglZWJwKQkJCS8qIHJvdW5kICovCisJZnJuZGludAorCisJZmxkY3cJLTQoJWVicCkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvbGlibS9pYTY0L01ha2VmaWxlLmluYyBiL2xpYm0vaWE2NC9NYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmMjI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaWE2NC9NYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw0IEBACisjICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9NYWtlZmlsZS5pbmMsdiAxLjIgMjAwNS8wMy8wNyAwNDo1NDowMiBkYXMgRXhwICQKKworQVJDSF9TUkNTID0gc19mbWEuUyBzX2ZtYWYuUyBzX2ZtYWwuUworTERCTF9QUkVDID0gNjQKZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9fZnBtYXRoLmggYi9saWJtL2lhNjQvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTc1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL2lhNjQvX2ZwbWF0aC5oLHYgMS42IDIwMDUvMDMvMDcgMDQ6NTU6NDAgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworI2lmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmgJOjMyOworCQl1bnNpZ25lZCBpbnQJZXhwCToxNTsKKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGxvbmcJanVuawk6NDg7CisjZWxzZSAvKiBfQklHX0VORElBTiAqLworCQl1bnNpZ25lZCBsb25nCWp1bmsJOjQ4OworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGludAltYW5oCTozMjsKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworI2VuZGlmCisJfSBiaXRzOworfTsKKworI2lmIF9CWVRFX09SREVSID09IF9MSVRUTEVfRU5ESUFOCisjZGVmaW5lCUxEQkxfTkJJVAkweDgwMDAwMDAwCisjZGVmaW5lCW1hc2tfbmJpdF9sKHUpCSgodSkuYml0cy5tYW5oICY9IH5MREJMX05CSVQpCisjZWxzZSAvKiBfQklHX0VORElBTiAqLworLyoKKyAqIFhYWCBUaGlzIGRvZXNuJ3QgbG9vayByaWdodC4gIFZlcnkgZmV3IG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQKKyAqICAgICBlbmRpYW5uZXNzIGZvciBpbnRlZ2VycyBhbmQgZmxvYXRpbmctcG9pbnQsIGFuZCBpbiBuZXh0YWZ0ZXJsKCkKKyAqICAgICB3ZSBhc3N1bWUgdGhhdCBub25lIGRvLiAgSWYgeW91IGhhdmUgYW4gZW52aXJvbm1lbnQgZm9yIHRlc3RpbmcKKyAqICAgICB0aGlzLCBwbGVhc2UgbGV0IG1lIGtub3cuIC0tZGFzCisgKi8KKyNkZWZpbmUJTERCTF9OQklUCTB4ODAKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh1KS5iaXRzLm1hbmggJj0gfkxEQkxfTkJJVCkKKyNlbmRpZgorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTMyCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL2lhNjQvZmVudi5jIGIvbGlibS9pYTY0L2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pYTY0L2ZlbnYuYwpAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9mZW52LmMsdiAxLjIgMjAwNC8wNi8xMSAwMjozNTozMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmVudi5oPgorCitjb25zdCBmZW52X3QgX19mZV9kZmxfZW52ID0gMHgwMDA5ODA0YzhhNzAwMzNmVUxMOworCisvKgorICogSXQgZG9lc24ndCBwYXkgdG8gaW5saW5lIGZldXBkYXRlZW52KCkgYmVjYXVzZSBpdCBpbmNsdWRlcyBvbmUgb2YKKyAqIHRoZSByYXJlIHVzZXMgb2YgZmVyYWlzZWV4Y2VwdCgpIHdoZXJlIHRoZSBhcmd1bWVudCBpcyBub3QgYQorICogY29uc3RhbnQuICBUaHVzLCBubyBkZWFkIGNvZGUgZWxpbWluYXRpb24gY2FuIG9jY3VyLCByZXN1bHRpbmcgaW4KKyAqIHNpZ25pZmljYW50IGJsb2F0LgorICovCitpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqZW52cCkKK3sKKwlmZW52X3QgZnBzcjsKKworCV9fc3RmcHNyKCZmcHNyKTsKKwlfX2xkZnBzcigqZW52cCk7CisJZmVyYWlzZWV4Y2VwdCgoZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9mZW52LmggYi9saWJtL2lhNjQvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvZmVudi5oCkBAIC0wLDAgKzEsMjQyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pYTY0L2ZlbnYuaCx2IDEuNCAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQ2NF90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50MTZfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDEKKyNkZWZpbmUJRkVfREVOT1JNQUwJMHgwMgorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDA4CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDEwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9ERU5PUk1BTCB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfSU5WQUxJRCB8IEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKQorCisvKiBSb3VuZGluZyBtb2RlcyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwMDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDQwMAorI2RlZmluZQlGRV9VUFdBUkQJMHgwODAwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgwYzAwCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisjZGVmaW5lCV9GUFVTV19TSElGVAkxMworCisjZGVmaW5lCV9fc3RmcHNyKF9fcikJX19hc20gX192b2xhdGlsZSgibW92ICUwPWFyLmZwc3IiIDogIj1yIiAoKihfX3IpKSkKKyNkZWZpbmUJX19sZGZwc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJtb3YgYXIuZnBzcj0lMDs7IiA6IDogInIiIChfX3IpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+KChmZW52X3QpX19leGNlcHRzIDw8IF9GUFVTV19TSElGVCk7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwkqX19mbGFncCA9IChmZXhjZXB0X3QpKF9fZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZXhjZXB0ZmxhZyhjb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+KChmZW52X3QpX19leGNlcHRzIDw8IF9GUFVTV19TSElGVCk7CisJX19mcHNyIHw9IChmZW52X3QpKF9fZXhjZXB0cyAmICpfX2ZsYWdwKSA8PCBfRlBVU1dfU0hJRlQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSXQgaXMgd29ydGh3aGlsZSB0byB1c2UgdGhlIGlubGluZSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaWZmIGl0CisgKiBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudHMgdGhhdCBhcmUgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoZHVlIHRvCisgKiBkZWFkIGNvZGUgZWxpbWluYXRpb24pLiAgVW5mb3J0dW5hdGVseSwgZ2NjIGlzbid0IHNtYXJ0IGVub3VnaCB0bworICogZmlndXJlIHRoaXMgb3V0IGF1dG9tYXRpY2FsbHksIGFuZCB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIGl0LgorICogV2UgYXNzdW1lIHRoYXQgY29uc3RhbnQgYXJndW1lbnRzIHdpbGwgYmUgdGhlIGNvbW1vbiBjYXNlLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdm9sYXRpbGUgZG91YmxlIGQ7CisKKwkvKgorCSAqIFdpdGggYSBjb21waWxlciB0aGF0IHN1cHBvcnRzIHRoZSBGRU5WX0FDQ0VTUyBwcmFnbWEKKwkgKiBwcm9wZXJseSwgc2ltcGxlIGV4cHJlc3Npb25zIGxpa2UgJzAuMCAvIDAuMCcgc2hvdWxkCisJICogYmUgc3VmZmljaWVudCB0byBnZW5lcmF0ZSB0cmFwcy4gIFVuZm9ydHVuYXRlbHksIHdlCisJICogbmVlZCB0byBicmluZyBhIHZvbGF0aWxlIHZhcmlhYmxlIGludG8gdGhlIGVxdWF0aW9uCisJICogdG8gcHJldmVudCBpbmNvcnJlY3Qgb3B0aW1pemF0aW9ucy4KKwkgKi8KKwlpZiAoX19leGNlcHRzICYgRkVfSU5WQUxJRCkgeworCQlkID0gMC4wOworCQlkID0gMC4wIC8gZDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX0RJVkJZWkVSTykgeworCQlkID0gMC4wOworCQlkID0gMS4wIC8gZDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX09WRVJGTE9XKSB7CisJCWQgPSAweDEuZmZwMTAyMzsKKwkJZCAqPSAyLjA7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9VTkRFUkZMT1cpIHsKKwkJZCA9IDB4MXAtMTAyMjsKKwkJZCAvPSAweDFwMTAyMzsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX0lORVhBQ1QpIHsKKwkJZCA9IDB4MXAtMTAyMjsKKwkJZCArPSAxLjA7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwlyZXR1cm4gKChfX2Zwc3IgPj4gX0ZQVVNXX1NISUZUKSAmIF9fZXhjZXB0cyk7Cit9CisKKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwlyZXR1cm4gKF9fZnBzciAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlmZW52X3QgX19mcHNyOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fc3RmcHNyKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+X1JPVU5EX01BU0s7CisJX19mcHNyIHw9IF9fcm91bmQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGVudihmZW52X3QgKl9fZW52cCkKK3sKKworCV9fc3RmcHNyKF9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlfX3N0ZnBzcigmX19mcHNyKTsKKwkqX19lbnZwID0gX19mcHNyOworCV9fZnBzciAmPSB+KChmZW52X3QpRkVfQUxMX0VYQ0VQVCA8PCBfRlBVU1dfU0hJRlQpOworCV9fZnBzciB8PSBGRV9BTExfRVhDRVBUOworCV9fbGRmcHNyKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisKKwlfX2xkZnBzcigqX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworCisjaWYgX19CU0RfVklTSUJMRQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCWZlbnZfdCBfX25ld2Zwc3IsIF9fb2xkZnBzcjsKKworCV9fc3RmcHNyKCZfX29sZGZwc3IpOworCV9fbmV3ZnBzciA9IF9fb2xkZnBzciAmIH4oX19tYXNrICYgRkVfQUxMX0VYQ0VQVCk7CisJX19sZGZwc3IoX19uZXdmcHNyKTsKKwlyZXR1cm4gKH5fX29sZGZwc3IgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fbmV3ZnBzciwgX19vbGRmcHNyOworCisJX19zdGZwc3IoJl9fb2xkZnBzcik7CisJX19uZXdmcHNyID0gX19vbGRmcHNyIHwgKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpOworCV9fbGRmcHNyKF9fbmV3ZnBzcik7CisJcmV0dXJuICh+X19vbGRmcHNyICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAofl9fZnBzciAmIEZFX0FMTF9FWENFUFQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL2lhNjQvc19mbWEuUyBiL2xpYm0vaWE2NC9zX2ZtYS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTZjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2lhNjQvc19mbWEuUwpAQCAtMCwwICsxLDM0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9zX2ZtYS5TLHYgMS4xIDIwMDUvMDEvMjIgMDk6NTM6MTggZGFzIEV4cCAkIikKKworRU5UUlkoZm1hLCAzKQoreworCWZtYS5kCQlmOCA9IGY4LCBmOSwgZjEwCisJYnIucmV0LnNwdGsJYjAKK30KZGlmZiAtLWdpdCBhL2xpYm0vaWE2NC9zX2ZtYWYuUyBiL2xpYm0vaWE2NC9zX2ZtYWYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjAwNTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pYTY0L3NfZm1hZi5TCkBAIC0wLDAgKzEsMzQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9pYTY0L3NfZm1hZi5TLHYgMS4xIDIwMDUvMDEvMjIgMDk6NTM6MTggZGFzIEV4cCAkIikKKworRU5UUlkoZm1hZiwgMykKK3sKKwlmbWEucwkJZjggPSBmOCwgZjksIGYxMAorCWJyLnJldC5zcHRrCWIwCit9CmRpZmYgLS1naXQgYS9saWJtL2lhNjQvc19mbWFsLlMgYi9saWJtL2lhNjQvc19mbWFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4YzQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaWE2NC9zX2ZtYWwuUwpAQCAtMCwwICsxLDM0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vaWE2NC9zX2ZtYWwuUyx2IDEuMSAyMDA1LzAzLzA3IDA0OjUzOjExIGRhcyBFeHAgJCIpCisKK0VOVFJZKGZtYWwsIDMpCit7CisJZm1hCQlmOCA9IGY4LCBmOSwgZjEwCisJYnIucmV0LnNwdGsJYjAKK30KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9hbHBoYS9mZW52LmggYi9saWJtL2luY2x1ZGUvYWxwaGEvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjN2JjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvYWxwaGEvZmVudi5oCkBAIC0wLDAgKzEsMTg1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hbHBoYS9mZW52LmgsdiAxLjMgMjAwNS8wMy8xNiAxOTowMzo0NCBkYXMgRXhwICQKKyAqLworCisjaWZuZGVmCV9GRU5WX0hfCisjZGVmaW5lCV9GRU5WX0hfCisKKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisKK3R5cGVkZWYJX191aW50NjRfdAlmZW52X3Q7Cit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0lOVE9WRgkweDQwCS8qIG5vdCBtYXNrYWJsZSAqLworI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgRkVfSU5UT1ZGIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDEKKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDIKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisjZGVmaW5lCV9ST1VORF9TSElGVAk1OAorCisjZGVmaW5lCV9GUFVTV19TSElGVAk1MQorCisjZGVmaW5lCV9fZXhjYigpCV9fYXNtIF9fdm9sYXRpbGUoImV4Y2IiKQorI2RlZmluZQlfX21mX2ZwY3IoX19jdykJX19hc20gX192b2xhdGlsZSgibWZfZnBjciAlMCIgOiAiPWYiICgqKF9fY3cpKSkKKyNkZWZpbmUJX19tdF9mcGNyKF9fY3cpCV9fYXNtIF9fdm9sYXRpbGUoIm10X2ZwY3IgJTAiIDogOiAiZiIgKF9fY3cpKQorCit1bmlvbiBfX2ZwY3IgeworCWRvdWJsZSBfX2Q7CisJZmVudl90IF9fYml0czsKK307CisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX210X2ZwY3IoX19yLl9fZCk7CisJX19leGNiKCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwkqX19mbGFncCA9IChfX3IuX19iaXRzID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCWZlbnZfdCBfX3hmbGFnLCBfX3hleGNlcHRzOworCisJX194ZmxhZyA9IChmZW52X3QpKl9fZmxhZ3AgPDwgX0ZQVVNXX1NISUZUOworCV9feGV4Y2VwdHMgPSAoZmVudl90KV9fZXhjZXB0cyA8PCBfRlBVU1dfU0hJRlQ7CisJX19leGNiKCk7CisJX19tZl9mcGNyKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzICY9IH5fX3hleGNlcHRzOworCV9fci5fX2JpdHMgfD0gX194ZmxhZyAmIF9feGV4Y2VwdHM7CisJX19tdF9mcGNyKF9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKworCS8qCisJICogWFhYIEdlbmVyYXRpbmcgZXhjZXB0aW9ucyB0aGlzIHdheSBkb2VzIG5vdCBhY3R1YWxseSBpbnZva2UKKwkgKiBhIHVzZXJsYW5kIHRyYXAgaGFuZGxlciB3aGVuIGVuYWJsZWQsIGJ1dCBuZWl0aGVyIGRvCisJICogYXJpdGhtZXRpYyBvcGVyYXRpb25zIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiAgUGVyaGFwcyB0aGVyZQorCSAqIGFyZSBtb3JlIGJ1Z3MgaW4gdGhlIGtlcm5lbCB0cmFwIGhhbmRsZXIuCisJICovCisJZmV4Y2VwdF90IF9fZXggPSBfX2V4Y2VwdHM7CisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBjciBfX3I7CisKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fZXhjYigpOworCXJldHVybiAoKF9fci5fX2JpdHMgPj4gX0ZQVVNXX1NISUZUKSAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwl1bmlvbiBfX2ZwY3IgX19yOworCisJLyoKKwkgKiBObyBleGNlcHRpb24gYmFycmllcnMgc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgaWYgd2UgYXNzdW1lCisJICogdGhhdCBvbmx5IGZlc2V0cm91bmQoKSBjYW4gY2hhbmdlIHRoZSByb3VuZGluZyBtb2RlLgorCSAqLworCV9fbWZfZnBjcigmX19yLl9fZCk7CisJcmV0dXJuICgoaW50KShfX3IuX19iaXRzID4+IF9ST1VORF9TSElGVCkgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJdW5pb24gX19mcGNyIF9fcjsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKwlfX2V4Y2IoKTsKKwlfX21mX2ZwY3IoJl9fci5fX2QpOworCV9fci5fX2JpdHMgJj0gfigoZmVudl90KV9ST1VORF9NQVNLIDw8IF9ST1VORF9TSElGVCk7CisJX19yLl9fYml0cyB8PSAoZmVudl90KV9fcm91bmQgPDwgX1JPVU5EX1NISUZUOworCV9fbXRfZnBjcihfX3IuX19kKTsKKwlfX2V4Y2IoKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQJZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50CWZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CitpbnQJZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApOworaW50CWZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50CWZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50CWZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludAlmZWdldGV4Y2VwdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2FtZDY0L2ZlbnYuaCBiL2xpYm0vaW5jbHVkZS9hbWQ2NC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaW5jbHVkZS9hbWQ2NC9mZW52LmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2FtZDY0L2ZlbnYuaCx2IDEuNSAyMDA1LzAzLzE2IDIyOjM0OjE0IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB7CisJCV9fdWludDMyX3QJX19jb250cm9sOworCQlfX3VpbnQzMl90CV9fc3RhdHVzOworCQlfX3VpbnQzMl90CV9fdGFnOworCQljaGFyCQlfX290aGVyWzE2XTsKKwl9IF9feDg3OworCV9fdWludDMyX3QJCV9fbXhjc3I7Cit9IGZlbnZfdDsKKwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMQorI2RlZmluZQlGRV9ERU5PUk1BTAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0RFTk9STUFMIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgwNDAwCisjZGVmaW5lCUZFX1VQV0FSRAkweDA4MDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDBjMDAKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKKy8qCisgKiBBcyBjb21wYXJlZCB0byB0aGUgeDg3IGNvbnRyb2wgd29yZCwgdGhlIFNTRSB1bml0J3MgY29udHJvbCB3b3JkCisgKiBoYXMgdGhlIHJvdW5kaW5nIGNvbnRyb2wgYml0cyBvZmZzZXQgYnkgMyBhbmQgdGhlIGV4Y2VwdGlvbiBtYXNrCisgKiBiaXRzIG9mZnNldCBieSA3LgorICovCisjZGVmaW5lCV9TU0VfUk9VTkRfU0hJRlQJMworI2RlZmluZQlfU1NFX0VNQVNLX1NISUZUCTcKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworI2RlZmluZQlfX2ZsZGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRjdyAlMCIgOiA6ICJtIiAoX19jdykpCisjZGVmaW5lCV9fZmxkZW52KF9fZW52KQkJX19hc20gX192b2xhdGlsZSgiZmxkZW52ICUwIiA6IDogIm0iIChfX2VudikpCisjZGVmaW5lCV9fZm5jbGV4KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZuY2xleCIpCisjZGVmaW5lCV9fZm5zdGVudihfX2VudikJX19hc20gX192b2xhdGlsZSgiZm5zdGVudiAlMCIgOiAiPW0iICgqKF9fZW52KSkpCisjZGVmaW5lCV9fZm5zdGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0Y3cgJTAiIDogIj1tIiAoKihfX2N3KSkpCisjZGVmaW5lCV9fZm5zdHN3KF9fc3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0c3cgJTAiIDogIj1hbSIgKCooX19zdykpKQorI2RlZmluZQlfX2Z3YWl0KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZ3YWl0IikKKyNkZWZpbmUJX19sZG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJsZG14Y3NyICUwIiA6IDogIm0iIChfX2NzcikpCisjZGVmaW5lCV9fc3RteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgic3RteGNzciAlMCIgOiAiPW0iICgqKF9fY3NyKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19lbnY7CisKKwlpZiAoX19leGNlcHRzID09IEZFX0FMTF9FWENFUFQpIHsKKwkJX19mbmNsZXgoKTsKKwl9IGVsc2UgeworCQlfX2Zuc3RlbnYoJl9fZW52Ll9feDg3KTsKKwkJX19lbnYuX194ODcuX19zdGF0dXMgJj0gfl9fZXhjZXB0czsKKwkJX19mbGRlbnYoX19lbnYuX194ODcpOworCX0KKwlfX3N0bXhjc3IoJl9fZW52Ll9fbXhjc3IpOworCV9fZW52Ll9fbXhjc3IgJj0gfl9fZXhjZXB0czsKKwlfX2xkbXhjc3IoX19lbnYuX19teGNzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX3N0bXhjc3IoJl9fbXhjc3IpOworCV9fZm5zdHN3KCZfX3N0YXR1cyk7CisJKl9fZmxhZ3AgPSAoX19teGNzciB8IF9fc3RhdHVzKSAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cyk7CitpbnQgZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19zdG14Y3NyKCZfX214Y3NyKTsKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCXJldHVybiAoKF9fc3RhdHVzIHwgX19teGNzcikgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFncmVlIG9uIHRoZQorCSAqIHJvdW5kaW5nIG1vZGUuICBSZWFkaW5nIHRoZSBjb250cm9sIHdvcmQgb24gdGhlIHg4NyB0dXJucworCSAqIG91dCB0byBiZSBhYm91dCA1IHRpbWVzIGZhc3RlciB0aGFuIHJlYWRpbmcgaXQgb24gdGhlIFNTRQorCSAqIHVuaXQgb24gYW4gT3B0ZXJvbiAyNDQuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuIChfX2NvbnRyb2wgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJaW50IF9fbXhjc3IsIF9fY29udHJvbDsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCV9fY29udHJvbCAmPSB+X1JPVU5EX01BU0s7CisJX19jb250cm9sIHw9IF9fcm91bmQ7CisJX19mbGRjdyhfX2NvbnRyb2wpOworCisJX19zdG14Y3NyKCZfX214Y3NyKTsKKwlfX214Y3NyICY9IH4oX1JPVU5EX01BU0sgPDwgX1NTRV9ST1VORF9TSElGVCk7CisJX19teGNzciB8PSBfX3JvdW5kIDw8IF9TU0VfUk9VTkRfU0hJRlQ7CisJX19sZG14Y3NyKF9fbXhjc3IpOworCisJcmV0dXJuICgwKTsKK30KKworaW50IGZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKTsKK2ludCBmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fZmxkZW52KF9fZW52cC0+X194ODcpOworCV9fbGRteGNzcihfX2VudnAtPl9fbXhjc3IpOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK2ludCBmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKK2ludCBmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzayk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIG1hc2tzIGZvciB0aGUgeDg3IGFuZCB0aGUgU1NFIHVuaXQgYXJlCisJICogdGhlIHNhbWUuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuICh+X19jb250cm9sICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9hcm0vZmVudi5oIGIvbGlibS9pbmNsdWRlL2FybS9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhODg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vaW5jbHVkZS9hcm0vZmVudi5oCkBAIC0wLDAgKzEsMjE3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9hcm0vZmVudi5oLHYgMS41IDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDMyX3QJZmVudl90OwordHlwZWRlZglfX3VpbnQzMl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMDAxCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDAwMDIKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwMDA0CisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDAwMDgKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDAwMTAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwMDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDAwMgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAwMDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHN0YXR1cyBmbGFnIHBvc2l0aW9ucyB0byBtYXNrIGZsYWcgcG9zaXRpb25zICovCisjZGVmaW5lIF9GUFVTV19TSElGVAkxNgorI2RlZmluZQlfRU5BQkxFX01BU0sJKEZFX0FMTF9FWENFUFQgPDwgX0ZQVVNXX1NISUZUKQorCisjaWZkZWYJQVJNX0hBUkRfRkxPQVQKKyNkZWZpbmUJX19yZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJyZnMgJTAiIDogIj1yIiAoKihfX2Zwc3IpKSkKKyNkZWZpbmUJX193ZnMoX19mcHNyKQlfX2FzbSBfX3ZvbGF0aWxlKCJ3ZnMgJTAiIDogOiAiciIgKF9fZnBzcikpCisjZWxzZQorI2RlZmluZSBfX3JmcyhfX2Zwc3IpCisjZGVmaW5lIF9fd2ZzKF9fZnBzcikKKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCV9fZnBzciAmPSB+X19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJKl9fZmxhZ3AgPSBfX2Zwc3IgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJX19mcHNyICY9IH5fX2V4Y2VwdHM7CisJX19mcHNyIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fd2ZzKF9fZnBzcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX2V4ID0gX19leGNlcHRzOworCisJZmVzZXRleGNlcHRmbGFnKCZfX2V4LCBfX2V4Y2VwdHMpOwkvKiBYWFggKi8KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19mcHNyOworCisJX19yZnMoJl9fZnBzcik7CisJcmV0dXJuIChfX2Zwc3IgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisKKwkvKgorCSAqIEFwcGFyZW50bHksIHRoZSByb3VuZGluZyBtb2RlIGlzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZQorCSAqIGluc3RydWN0aW9uIGZvcm1hdCBvbiBBUk0sIHNvIHRoZSBkeW5hbWljIHJvdW5kaW5nIG1vZGUgaXMKKwkgKiBpbmRldGVybWluYXRlLiAgU29tZSBGUFVzIG1heSBkaWZmZXIuCisJICovCisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisKKwlfX3JmcyhfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19lbnY7CisKKwlfX3JmcygmX19lbnYpOworCSpfX2VudnAgPSBfX2VudjsKKwlfX2VudiAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fd2ZzKF9fZW52KTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fd2ZzKCpfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCWZleGNlcHRfdCBfX2Zwc3I7CisKKwlfX3JmcygmX19mcHNyKTsKKwlfX3dmcygqX19lbnZwKTsKKwlmZXJhaXNlZXhjZXB0KF9fZnBzciAmIEZFX0FMTF9FWENFUFQpOworCXJldHVybiAoMCk7Cit9CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fb2xkX2Zwc3IsIF9fbmV3X2Zwc3I7CisKKwlfX3JmcygmX19vbGRfZnBzcik7CisJX19uZXdfZnBzciA9IF9fb2xkX2Zwc3IgfCAoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUOworCV9fd2ZzKF9fbmV3X2Zwc3IpOworCXJldHVybiAoKF9fb2xkX2Zwc3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfZnBzciwgX19uZXdfZnBzcjsKKworCV9fcmZzKCZfX29sZF9mcHNyKTsKKwlfX25ld19mcHNyID0gX19vbGRfZnBzciAmIH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpIDw8IF9GUFVTV19TSElGVCk7CisJX193ZnMoX19uZXdfZnBzcik7CisJcmV0dXJuICgoX19vbGRfZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fcmZzKCZfX2Zwc3IpOworCXJldHVybiAoKF9fZnBzciAmIF9FTkFCTEVfTUFTSykgPj4gX0ZQVVNXX1NISUZUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2kzODcvZmVudi5oIGIvbGlibS9pbmNsdWRlL2kzODcvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjQzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvaTM4Ny9mZW52LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2kzODcvZmVudi5oLHYgMS40IDIwMDUvMDMvMTcgMjI6MjE6NDYgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCisvKiAgICAgICAgICAgICAgICAgICAKKyAqIFRvIHByZXNlcnZlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggRnJlZUJTRCA1LjMsIHdlIHBhY2sgdGhlCisgKiBteGNzciBpbnRvIHNvbWUgcmVzZXJ2ZWQgZmllbGRzLCByYXRoZXIgdGhhbiBjaGFuZ2luZyBzaXplb2YoZmVudl90KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdWludDE2X3QJX19jb250cm9sOworCV9fdWludDE2X3QgICAgICBfX214Y3NyX2hpOworCV9fdWludDE2X3QJX19zdGF0dXM7CisJX191aW50MTZfdCAgICAgIF9fbXhjc3JfbG87CisJX191aW50MzJfdAlfX3RhZzsKKwljaGFyCQlfX290aGVyWzE2XTsKK30gZmVudl90OworCisjZGVmaW5lCV9fZ2V0X214Y3NyKGVudikJKCgoZW52KS5fX214Y3NyX2hpIDw8IDE2KSB8CVwKKwkJCQkgKChlbnYpLl9fbXhjc3JfbG8pKQorI2RlZmluZQlfX3NldF9teGNzcihlbnYsIHgpCWRvIHsJCQkJXAorCShlbnYpLl9fbXhjc3JfaGkgPSAoX191aW50MzJfdCkoeCkgPj4gMTY7CQlcCisJKGVudikuX19teGNzcl9sbyA9IChfX3VpbnQxNl90KSh4KTsJCQlcCit9IHdoaWxlICgwKQorCit0eXBlZGVmCV9fdWludDE2X3QJZmV4Y2VwdF90OworCisvKiBFeGNlcHRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRkVfSU5WQUxJRAkweDAxCisjZGVmaW5lCUZFX0RFTk9STUFMCTB4MDIKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDQKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwOAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgxMAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MjAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfREVOT1JNQUwgfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9ET1dOV0FSRAkweDA0MDAKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDgwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MGMwMAorI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKworLyoKKyAqIEFzIGNvbXBhcmVkIHRvIHRoZSB4ODcgY29udHJvbCB3b3JkLCB0aGUgU1NFIHVuaXQncyBjb250cm9sIHdvcmQKKyAqIGhhcyB0aGUgcm91bmRpbmcgY29udHJvbCBiaXRzIG9mZnNldCBieSAzIGFuZCB0aGUgZXhjZXB0aW9uIG1hc2sKKyAqIGJpdHMgb2Zmc2V0IGJ5IDcuCisgKi8KKyNkZWZpbmUJX1NTRV9ST1VORF9TSElGVAkzCisjZGVmaW5lCV9TU0VfRU1BU0tfU0hJRlQJNworCisvKiBBZnRlciB0ZXN0aW5nIGZvciBTU0Ugc3VwcG9ydCBvbmNlLCB3ZSBjYWNoZSB0aGUgcmVzdWx0IGluIF9faGFzX3NzZS4gKi8KK2VudW0gX19zc2Vfc3VwcG9ydCB7IF9fU1NFX1lFUywgX19TU0VfTk8sIF9fU1NFX1VOSyB9OworZXh0ZXJuIGVudW0gX19zc2Vfc3VwcG9ydCBfX2hhc19zc2U7CitpbnQgX190ZXN0X3NzZSh2b2lkKTsKKyNpZmRlZiBfX1NTRV9fCisjZGVmaW5lCV9fSEFTX1NTRSgpCTEKKyNlbHNlCisjZGVmaW5lCV9fSEFTX1NTRSgpCShfX2hhc19zc2UgPT0gX19TU0VfWUVTIHx8CQkJXAorCQkJIChfX2hhc19zc2UgPT0gX19TU0VfVU5LICYmIF9fdGVzdF9zc2UoKSkpCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworI2RlZmluZQlfX2ZsZGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbGRjdyAlMCIgOiA6ICJtIiAoX19jdykpCisjZGVmaW5lCV9fZmxkZW52KF9fZW52KQkJX19hc20gX192b2xhdGlsZSgiZmxkZW52ICUwIiA6IDogIm0iIChfX2VudikpCisjZGVmaW5lCV9fZm5jbGV4KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZuY2xleCIpCisjZGVmaW5lCV9fZm5zdGVudihfX2VudikJX19hc20gX192b2xhdGlsZSgiZm5zdGVudiAlMCIgOiAiPW0iICgqKF9fZW52KSkpCisjZGVmaW5lCV9fZm5zdGN3KF9fY3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0Y3cgJTAiIDogIj1tIiAoKihfX2N3KSkpCisjZGVmaW5lCV9fZm5zdHN3KF9fc3cpCQlfX2FzbSBfX3ZvbGF0aWxlKCJmbnN0c3cgJTAiIDogIj1hbSIgKCooX19zdykpKQorI2RlZmluZQlfX2Z3YWl0KCkJCV9fYXNtIF9fdm9sYXRpbGUoImZ3YWl0IikKKyNkZWZpbmUJX19sZG14Y3NyKF9fY3NyKQlfX2FzbSBfX3ZvbGF0aWxlKCJsZG14Y3NyICUwIiA6IDogIm0iIChfX2NzcikpCisjZGVmaW5lCV9fc3RteGNzcihfX2NzcikJX19hc20gX192b2xhdGlsZSgic3RteGNzciAlMCIgOiAiPW0iICgqKF9fY3NyKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19lbnY7CisJaW50IF9fbXhjc3I7CisKKwlpZiAoX19leGNlcHRzID09IEZFX0FMTF9FWENFUFQpIHsKKwkJX19mbmNsZXgoKTsKKwl9IGVsc2UgeworCQlfX2Zuc3RlbnYoJl9fZW52KTsKKwkJX19lbnYuX19zdGF0dXMgJj0gfl9fZXhjZXB0czsKKwkJX19mbGRlbnYoX19lbnYpOworCX0KKwlpZiAoX19IQVNfU1NFKCkpIHsKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwkJX19teGNzciAmPSB+X19leGNlcHRzOworCQlfX2xkbXhjc3IoX19teGNzcik7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJaW50IF9fbXhjc3IsIF9fc3RhdHVzOworCisJX19mbnN0c3coJl9fc3RhdHVzKTsKKwlpZiAoX19IQVNfU1NFKCkpCisJCV9fc3RteGNzcigmX19teGNzcik7CisJZWxzZQorCQlfX214Y3NyID0gMDsKKwkqX19mbGFncCA9IChfX214Y3NyIHwgX19zdGF0dXMpICYgX19leGNlcHRzOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKTsKK2ludCBmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpOworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlpbnQgX19teGNzciwgX19zdGF0dXM7CisKKwlfX2Zuc3RzdygmX19zdGF0dXMpOworCWlmIChfX0hBU19TU0UoKSkKKwkJX19zdG14Y3NyKCZfX214Y3NyKTsKKwllbHNlCisJCV9fbXhjc3IgPSAwOworCXJldHVybiAoKF9fc3RhdHVzIHwgX19teGNzcikgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJaW50IF9fY29udHJvbDsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHg4NyBhbmQgdGhlIFNTRSB1bml0IGFncmVlIG9uIHRoZQorCSAqIHJvdW5kaW5nIG1vZGUuICBSZWFkaW5nIHRoZSBjb250cm9sIHdvcmQgb24gdGhlIHg4NyB0dXJucworCSAqIG91dCB0byBiZSBhYm91dCA1IHRpbWVzIGZhc3RlciB0aGFuIHJlYWRpbmcgaXQgb24gdGhlIFNTRQorCSAqIHVuaXQgb24gYW4gT3B0ZXJvbiAyNDQuCisJICovCisJX19mbnN0Y3coJl9fY29udHJvbCk7CisJcmV0dXJuIChfX2NvbnRyb2wgJiBfUk9VTkRfTUFTSyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0cm91bmQoaW50IF9fcm91bmQpCit7CisJaW50IF9fbXhjc3IsIF9fY29udHJvbDsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKworCV9fZm5zdGN3KCZfX2NvbnRyb2wpOworCV9fY29udHJvbCAmPSB+X1JPVU5EX01BU0s7CisJX19jb250cm9sIHw9IF9fcm91bmQ7CisJX19mbGRjdyhfX2NvbnRyb2wpOworCisJaWYgKF9fSEFTX1NTRSgpKSB7CisJCV9fc3RteGNzcigmX19teGNzcik7CisJCV9fbXhjc3IgJj0gfihfUk9VTkRfTUFTSyA8PCBfU1NFX1JPVU5EX1NISUZUKTsKKwkJX19teGNzciB8PSBfX3JvdW5kIDw8IF9TU0VfUk9VTkRfU0hJRlQ7CisJCV9fbGRteGNzcihfX214Y3NyKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQgZmVnZXRlbnYoZmVudl90ICpfX2VudnApOworaW50IGZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCk7CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX2VudiA9ICpfX2VudnA7CisJaW50IF9fbXhjc3I7CisKKwlfX214Y3NyID0gX19nZXRfbXhjc3IoX19lbnYpOworCV9fc2V0X214Y3NyKF9fZW52LCAweGZmZmZmZmZmKTsKKwlfX2ZsZGVudihfX2Vudik7CisJaWYgKF9fSEFTX1NTRSgpKQorCQlfX2xkbXhjc3IoX19teGNzcik7CisJcmV0dXJuICgwKTsKK30KKworaW50IGZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKTsKKworI2lmIF9fQlNEX1ZJU0lCTEUKKworaW50IGZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spOworaW50IGZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlpbnQgX19jb250cm9sOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgbWFza3MgZm9yIHRoZSB4ODcgYW5kIHRoZSBTU0UgdW5pdCBhcmUKKwkgKiB0aGUgc2FtZS4KKwkgKi8KKwlfX2Zuc3RjdygmX19jb250cm9sKTsKKwlyZXR1cm4gKH5fX2NvbnRyb2wgJiBGRV9BTExfRVhDRVBUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL2lhNjQvZmVudi5oIGIvbGlibS9pbmNsdWRlL2lhNjQvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvaWE2NC9mZW52LmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL2lhNjQvZmVudi5oLHYgMS40IDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDY0X3QJZmVudl90OwordHlwZWRlZglfX3VpbnQxNl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMQorI2RlZmluZQlGRV9ERU5PUk1BTAkweDAyCisjZGVmaW5lCUZFX0RJVkJZWkVSTwkweDA0CisjZGVmaW5lCUZFX09WRVJGTE9XCTB4MDgKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MTAKKyNkZWZpbmUJRkVfSU5FWEFDVAkweDIwCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0RFTk9STUFMIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgwNDAwCisjZGVmaW5lCUZFX1VQV0FSRAkweDA4MDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDBjMDAKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKyNkZWZpbmUJX0ZQVVNXX1NISUZUCTEzCisKKyNkZWZpbmUJX19zdGZwc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJtb3YgJTA9YXIuZnBzciIgOiAiPXIiICgqKF9fcikpKQorI2RlZmluZQlfX2xkZnBzcihfX3IpCV9fYXNtIF9fdm9sYXRpbGUoIm1vdiBhci5mcHNyPSUwOzsiIDogOiAiciIgKF9fcikpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCSpfX2ZsYWdwID0gKGZleGNlcHRfdCkoX19mcHNyID4+IF9GUFVTV19TSElGVCkgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH4oKGZlbnZfdClfX2V4Y2VwdHMgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2Zwc3IgfD0gKGZlbnZfdCkoX19leGNlcHRzICYgKl9fZmxhZ3ApIDw8IF9GUFVTV19TSElGVDsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBJdCBpcyB3b3J0aHdoaWxlIHRvIHVzZSB0aGUgaW5saW5lIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBpZmYgaXQKKyAqIGlzIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyB0aGF0IGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIChkdWUgdG8KKyAqIGRlYWQgY29kZSBlbGltaW5hdGlvbikuICBVbmZvcnR1bmF0ZWx5LCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvCisgKiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseSwgYW5kIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgaXQuCisgKiBXZSBhc3N1bWUgdGhhdCBjb25zdGFudCBhcmd1bWVudHMgd2lsbCBiZSB0aGUgY29tbW9uIGNhc2UuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl2b2xhdGlsZSBkb3VibGUgZDsKKworCS8qCisJICogV2l0aCBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgdGhlIEZFTlZfQUNDRVNTIHByYWdtYQorCSAqIHByb3Blcmx5LCBzaW1wbGUgZXhwcmVzc2lvbnMgbGlrZSAnMC4wIC8gMC4wJyBzaG91bGQKKwkgKiBiZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRyYXBzLiAgVW5mb3J0dW5hdGVseSwgd2UKKwkgKiBuZWVkIHRvIGJyaW5nIGEgdm9sYXRpbGUgdmFyaWFibGUgaW50byB0aGUgZXF1YXRpb24KKwkgKiB0byBwcmV2ZW50IGluY29ycmVjdCBvcHRpbWl6YXRpb25zLgorCSAqLworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKSB7CisJCWQgPSAwLjA7CisJCWQgPSAwLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfRElWQllaRVJPKSB7CisJCWQgPSAwLjA7CisJCWQgPSAxLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfT1ZFUkZMT1cpIHsKKwkJZCA9IDB4MS5mZnAxMDIzOworCQlkICo9IDIuMDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX1VOREVSRkxPVykgeworCQlkID0gMHgxcC0xMDIyOworCQlkIC89IDB4MXAxMDIzOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfSU5FWEFDVCkgeworCQlkID0gMHgxcC0xMDIyOworCQlkICs9IDEuMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAoKF9fZnBzciA+PiBfRlBVU1dfU0hJRlQpICYgX19leGNlcHRzKTsKK30KKworCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCXJldHVybiAoX19mcHNyICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWZlbnZfdCBfX2Zwc3I7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisJX19zdGZwc3IoJl9fZnBzcik7CisJX19mcHNyICY9IH5fUk9VTkRfTUFTSzsKKwlfX2Zwc3IgfD0gX19yb3VuZDsKKwlfX2xkZnBzcihfX2Zwc3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKQoreworCisJX19zdGZwc3IoX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApCit7CisJZmVudl90IF9fZnBzcjsKKworCV9fc3RmcHNyKCZfX2Zwc3IpOworCSpfX2VudnAgPSBfX2Zwc3I7CisJX19mcHNyICY9IH4oKGZlbnZfdClGRV9BTExfRVhDRVBUIDw8IF9GUFVTV19TSElGVCk7CisJX19mcHNyIHw9IEZFX0FMTF9FWENFUFQ7CisJX19sZGZwc3IoX19mcHNyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKworCV9fbGRmcHNyKCpfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK2ludCBmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCk7CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fbmV3ZnBzciwgX19vbGRmcHNyOworCisJX19zdGZwc3IoJl9fb2xkZnBzcik7CisJX19uZXdmcHNyID0gX19vbGRmcHNyICYgfihfX21hc2sgJiBGRV9BTExfRVhDRVBUKTsKKwlfX2xkZnBzcihfX25ld2Zwc3IpOworCXJldHVybiAofl9fb2xkZnBzciAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19uZXdmcHNyLCBfX29sZGZwc3I7CisKKwlfX3N0ZnBzcigmX19vbGRmcHNyKTsKKwlfX25ld2Zwc3IgPSBfX29sZGZwc3IgfCAoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCk7CisJX19sZGZwc3IoX19uZXdmcHNyKTsKKwlyZXR1cm4gKH5fX29sZGZwc3IgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHQodm9pZCkKK3sKKwlmZW52X3QgX19mcHNyOworCisJX19zdGZwc3IoJl9fZnBzcik7CisJcmV0dXJuICh+X19mcHNyICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9tYXRoLmggYi9saWJtL2luY2x1ZGUvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvbWF0aC5oCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBmcm9tOiBAKCMpZmRsaWJtLmggNS4xIDkzLzA5LzI0CisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9tYXRoLmgsdiAxLjYxIDIwMDUvMDQvMTYgMjE6MTI6NDcgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZiBfTUFUSF9IXworI2RlZmluZQlfTUFUSF9IXworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgX19wdXJlMgorCisvKgorICogQU5TSS9QT1NJWAorICovCitleHRlcm4gY29uc3QgdW5pb24gX19pbmZpbml0eV91biB7CisJdW5zaWduZWQgY2hhcglfX3VjWzhdOworCWRvdWJsZQkJX191ZDsKK30gX19pbmZpbml0eTsKKworZXh0ZXJuIGNvbnN0IHVuaW9uIF9fbmFuX3VuIHsKKwl1bnNpZ25lZCBjaGFyCV9fdWNbc2l6ZW9mKGZsb2F0KV07CisJZmxvYXQJCV9fdWY7Cit9IF9fbmFuOworCisvKiAjaWYgX19HTlVDX1BSRVJFUV9fKDMsIDMpIHx8IChkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIF9fSU5URUxfQ09NUElMRVIgPj0gODAwKSAqLworI2lmIDEKKyNkZWZpbmUJX19NQVRIX0JVSUxUSU5fQ09OU1RBTlRTCisjZW5kaWYKKworLyogI2lmIF9fR05VQ19QUkVSRVFfXygzLCAwKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAqLworI2lmIDEKKyNkZWZpbmUJX19NQVRIX0JVSUxUSU5fUkVMT1BTCisjZW5kaWYKKworLyogI2lmZGVmIF9fTUFUSF9CVUlMVElOX0NPTlNUQU5UUyAqLworI2lmIDEKKyNkZWZpbmUJSFVHRV9WQUwJX19idWlsdGluX2h1Z2VfdmFsKCkKKyNlbHNlCisjZGVmaW5lCUhVR0VfVkFMCShfX2luZmluaXR5Ll9fdWQpCisjZW5kaWYKKworLyogI2lmIF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5ICovCisjaWYgMAorI2RlZmluZQlGUF9JTE9HQjAJKC1fX0lOVF9NQVgpCisjZGVmaW5lCUZQX0lMT0dCTkFOCV9fSU5UX01BWAorI2Vsc2UKKyNkZWZpbmUJRlBfSUxPR0IwCSgtSU5UX01BWCkKKyNkZWZpbmUJRlBfSUxPR0JOQU4JSU5UX01BWAorI2VuZGlmCisKKyNpZmRlZiBfX01BVEhfQlVJTFRJTl9DT05TVEFOVFMKKyNkZWZpbmUJSFVHRV9WQUxGCV9fYnVpbHRpbl9odWdlX3ZhbGYoKQorI2RlZmluZQlIVUdFX1ZBTEwJX19idWlsdGluX2h1Z2VfdmFsbCgpCisjZGVmaW5lCUlORklOSVRZCV9fYnVpbHRpbl9pbmYoKQorI2RlZmluZQlOQU4JCV9fYnVpbHRpbl9uYW4oIiIpCisjZWxzZQorI2RlZmluZQlIVUdFX1ZBTEYJKGZsb2F0KUhVR0VfVkFMCisjZGVmaW5lCUhVR0VfVkFMTAkobG9uZyBkb3VibGUpSFVHRV9WQUwKKyNkZWZpbmUJSU5GSU5JVFkJSFVHRV9WQUxGCisjZGVmaW5lCU5BTgkJKF9fbmFuLl9fdWYpCisjZW5kaWYgLyogX19NQVRIX0JVSUxUSU5fQ09OU1RBTlRTICovCisKKyNkZWZpbmUJTUFUSF9FUlJOTwkxCisjZGVmaW5lCU1BVEhfRVJSRVhDRVBUCTIKKyNkZWZpbmUJbWF0aF9lcnJoYW5kbGluZwlNQVRIX0VSUkVYQ0VQVAorCisvKiBYWFggV2UgbmVlZCBhIDxtYWNoaW5lL21hdGguaD4uICovCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3NwYXJjNjRfXykKKyNkZWZpbmUJRlBfRkFTVF9GTUEKKyNlbmRpZgorI2lmZGVmIF9faWE2NF9fCisjZGVmaW5lCUZQX0ZBU1RfRk1BTAorI2VuZGlmCisjZGVmaW5lCUZQX0ZBU1RfRk1BRgorCisvKiBTeW1ib2xpYyBjb25zdGFudHMgdG8gY2xhc3NpZnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi8KKyNkZWZpbmUJRlBfSU5GSU5JVEUJMHgwMQorI2RlZmluZQlGUF9OQU4JCTB4MDIKKyNkZWZpbmUJRlBfTk9STUFMCTB4MDQKKyNkZWZpbmUJRlBfU1VCTk9STUFMCTB4MDgKKyNkZWZpbmUJRlBfWkVSTwkJMHgxMAorI2RlZmluZQlmcGNsYXNzaWZ5KHgpIFwKKyAgICAoKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkpID8gX19mcGNsYXNzaWZ5Zih4KSBcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gX19mcGNsYXNzaWZ5ZCh4KSBcCisgICAgOiBfX2ZwY2xhc3NpZnlsKHgpKQorCisjZGVmaW5lCWlzZmluaXRlKHgpCQkJCQlcCisgICAgKChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpKSA/IF9faXNmaW5pdGVmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX2lzZmluaXRlKHgpCVwKKyAgICA6IF9faXNmaW5pdGVsKHgpKQorI2RlZmluZQlpc2luZih4KQkJCQkJXAorICAgICgoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSkgPyBfX2lzaW5mZih4KQlcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gX19pc2luZih4KQlcCisgICAgOiBfX2lzaW5mbCh4KSkKKyNkZWZpbmUJaXNuYW4oeCkJCQkJCVwKKyAgICAoKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkpID8gaXNuYW5mKHgpCQlcCisgICAgOiAoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkpID8gaXNuYW4oeCkJXAorICAgIDogX19pc25hbmwoeCkpCisjZGVmaW5lCWlzbm9ybWFsKHgpCQkJCQlcCisgICAgKChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpKSA/IF9faXNub3JtYWxmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX2lzbm9ybWFsKHgpCVwKKyAgICA6IF9faXNub3JtYWxsKHgpKQorCisjaWZkZWYgX19NQVRIX0JVSUxUSU5fUkVMT1BTCisjZGVmaW5lCWlzZ3JlYXRlcih4LCB5KQkJX19idWlsdGluX2lzZ3JlYXRlcigoeCksICh5KSkKKyNkZWZpbmUJaXNncmVhdGVyZXF1YWwoeCwgeSkJX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKCh4KSwgKHkpKQorI2RlZmluZQlpc2xlc3MoeCwgeSkJCV9fYnVpbHRpbl9pc2xlc3MoKHgpLCAoeSkpCisjZGVmaW5lCWlzbGVzc2VxdWFsKHgsIHkpCV9fYnVpbHRpbl9pc2xlc3NlcXVhbCgoeCksICh5KSkKKyNkZWZpbmUJaXNsZXNzZ3JlYXRlcih4LCB5KQlfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcigoeCksICh5KSkKKyNkZWZpbmUJaXN1bm9yZGVyZWQoeCwgeSkJX19idWlsdGluX2lzdW5vcmRlcmVkKCh4KSwgKHkpKQorI2Vsc2UKKyNkZWZpbmUJaXNncmVhdGVyKHgsIHkpCQkoIWlzdW5vcmRlcmVkKCh4KSwgKHkpKSAmJiAoeCkgPiAoeSkpCisjZGVmaW5lCWlzZ3JlYXRlcmVxdWFsKHgsIHkpCSghaXN1bm9yZGVyZWQoKHgpLCAoeSkpICYmICh4KSA+PSAoeSkpCisjZGVmaW5lCWlzbGVzcyh4LCB5KQkJKCFpc3Vub3JkZXJlZCgoeCksICh5KSkgJiYgKHgpIDwgKHkpKQorI2RlZmluZQlpc2xlc3NlcXVhbCh4LCB5KQkoIWlzdW5vcmRlcmVkKCh4KSwgKHkpKSAmJiAoeCkgPD0gKHkpKQorI2RlZmluZQlpc2xlc3NncmVhdGVyKHgsIHkpCSghaXN1bm9yZGVyZWQoKHgpLCAoeSkpICYmIFwKKwkJCQkJKCh4KSA+ICh5KSB8fCAoeSkgPiAoeCkpKQorI2RlZmluZQlpc3Vub3JkZXJlZCh4LCB5KQkoaXNuYW4oeCkgfHwgaXNuYW4oeSkpCisjZW5kaWYgLyogX19NQVRIX0JVSUxUSU5fUkVMT1BTICovCisKKyNkZWZpbmUJc2lnbmJpdCh4KQkJCQkJXAorICAgICgoc2l6ZW9mICh4KSA9PSBzaXplb2YgKGZsb2F0KSkgPyBfX3NpZ25iaXRmKHgpCVwKKyAgICA6IChzaXplb2YgKHgpID09IHNpemVvZiAoZG91YmxlKSkgPyBfX3NpZ25iaXQoeCkJXAorICAgIDogX19zaWduYml0bCh4KSkKKworI2lmIDAKK3R5cGVkZWYJX19kb3VibGVfdAlkb3VibGVfdDsKK3R5cGVkZWYJX19mbG9hdF90CWZsb2F0X3Q7CisjZW5kaWYgCisvKiAjZW5kaWYgKi8gLyogX19JU09fQ19WSVNJQkxFID49IDE5OTkgKi8KKworLyoKKyAqIFhPUEVOL1NWSUQKKyAqLworLyogI2lmIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworI2RlZmluZQlNX0UJCTIuNzE4MjgxODI4NDU5MDQ1MjM1NAkvKiBlICovCisjZGVmaW5lCU1fTE9HMkUJCTEuNDQyNjk1MDQwODg4OTYzNDA3NAkvKiBsb2cgMmUgKi8KKyNkZWZpbmUJTV9MT0cxMEUJMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NQkvKiBsb2cgMTBlICovCisjZGVmaW5lCU1fTE4yCQkwLjY5MzE0NzE4MDU1OTk0NTMwOTQyCS8qIGxvZyBlMiAqLworI2RlZmluZQlNX0xOMTAJCTIuMzAyNTg1MDkyOTk0MDQ1Njg0MDIJLyogbG9nIGUxMCAqLworI2RlZmluZQlNX1BJCQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CS8qIHBpICovCisjZGVmaW5lCU1fUElfMgkJMS41NzA3OTYzMjY3OTQ4OTY2MTkyMwkvKiBwaS8yICovCisjZGVmaW5lCU1fUElfNAkJMC43ODUzOTgxNjMzOTc0NDgzMDk2MgkvKiBwaS80ICovCisjZGVmaW5lCU1fMV9QSQkJMC4zMTgzMDk4ODYxODM3OTA2NzE1NAkvKiAxL3BpICovCisjZGVmaW5lCU1fMl9QSQkJMC42MzY2MTk3NzIzNjc1ODEzNDMwOAkvKiAyL3BpICovCisjZGVmaW5lCU1fMl9TUVJUUEkJMS4xMjgzNzkxNjcwOTU1MTI1NzM5MAkvKiAyL3NxcnQocGkpICovCisjZGVmaW5lCU1fU1FSVDIJCTEuNDE0MjEzNTYyMzczMDk1MDQ4ODAJLyogc3FydCgyKSAqLworI2RlZmluZQlNX1NRUlQxXzIJMC43MDcxMDY3ODExODY1NDc1MjQ0MAkvKiAxL3NxcnQoMikgKi8KKworI2RlZmluZQlNQVhGTE9BVAkoKGZsb2F0KTMuNDAyODIzNDY2Mzg1Mjg4NjBlKzM4KQorZXh0ZXJuIGludCBzaWduZ2FtOworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworCisjaWYgX19CU0RfVklTSUJMRQorI2lmIDAKKy8qIE9sZCB2YWx1ZSBmcm9tIDQuNEJTRC1MaXRlIG1hdGguaDsgdGhpcyBpcyBwcm9iYWJseSBiZXR0ZXIuICovCisjZGVmaW5lCUhVR0UJCUhVR0VfVkFMCisjZWxzZQorI2RlZmluZQlIVUdFCQlNQVhGTE9BVAorI2VuZGlmCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCisvKgorICogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgZGVwZW5kIG9uIHRoZSByb3VuZGluZyBtb2RlIGFuZCBoYXZlIHRoZSBzaWRlCisgKiBlZmZlY3Qgb2YgcmFpc2luZyBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zLCBzbyB0aGV5IGFyZSBub3QgZGVjbGFyZWQKKyAqIGFzIF9fcHVyZTIuICBJbiBDOTksIEZFTlZfQUNDRVNTIGFmZmVjdHMgdGhlIHB1cml0eSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKi8KK19fQkVHSU5fREVDTFMKKy8qCisgKiBBTlNJL1BPU0lYCisgKi8KK2ludAlfX2ZwY2xhc3NpZnlkKGRvdWJsZSkgX19wdXJlMjsKK2ludAlfX2ZwY2xhc3NpZnlmKGZsb2F0KSBfX3B1cmUyOworaW50CV9fZnBjbGFzc2lmeWwobG9uZyBkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZWYoZmxvYXQpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZShkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2Zpbml0ZWwobG9uZyBkb3VibGUpIF9fcHVyZTI7CitpbnQJX19pc2luZmYoZmxvYXQpIF9fcHVyZTI7CitpbnQgICAgIF9faXNpbmYoZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNpbmZsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNuYW5sKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNub3JtYWxmKGZsb2F0KSBfX3B1cmUyOworaW50CV9faXNub3JtYWwoZG91YmxlKSBfX3B1cmUyOworaW50CV9faXNub3JtYWxsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworaW50CV9fc2lnbmJpdChkb3VibGUpIF9fcHVyZTI7CitpbnQJX19zaWduYml0ZihmbG9hdCkgX19wdXJlMjsKK2ludAlfX3NpZ25iaXRsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworCitkb3VibGUJYWNvcyhkb3VibGUpOworZG91YmxlCWFzaW4oZG91YmxlKTsKK2RvdWJsZQlhdGFuKGRvdWJsZSk7Citkb3VibGUJYXRhbjIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCWNvcyhkb3VibGUpOworZG91YmxlCXNpbihkb3VibGUpOworZG91YmxlCXRhbihkb3VibGUpOworCitkb3VibGUJY29zaChkb3VibGUpOworZG91YmxlCXNpbmgoZG91YmxlKTsKK2RvdWJsZQl0YW5oKGRvdWJsZSk7CisKK2RvdWJsZQlleHAoZG91YmxlKTsKK2RvdWJsZQlmcmV4cChkb3VibGUsIGludCAqKTsJLyogZnVuZGFtZW50YWxseSAhX19wdXJlMiAqLworZG91YmxlCWxkZXhwKGRvdWJsZSwgaW50KTsKK2RvdWJsZQlsb2coZG91YmxlKTsKK2RvdWJsZQlsb2cxMChkb3VibGUpOworZG91YmxlCW1vZGYoZG91YmxlLCBkb3VibGUgKik7CS8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KKworZG91YmxlCXBvdyhkb3VibGUsIGRvdWJsZSk7Citkb3VibGUJc3FydChkb3VibGUpOworCitkb3VibGUJY2VpbChkb3VibGUpOworZG91YmxlCWZhYnMoZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWZsb29yKGRvdWJsZSk7Citkb3VibGUJZm1vZChkb3VibGUsIGRvdWJsZSk7CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBpbiBDOTAuCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFIHx8IF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5IHx8IF9fWFNJX1ZJU0lCTEUgKi8KK2RvdWJsZQlhY29zaChkb3VibGUpOworZG91YmxlCWFzaW5oKGRvdWJsZSk7Citkb3VibGUJYXRhbmgoZG91YmxlKTsKK2RvdWJsZQljYnJ0KGRvdWJsZSk7Citkb3VibGUJZXJmKGRvdWJsZSk7Citkb3VibGUJZXJmYyhkb3VibGUpOworZG91YmxlCWV4cDIoZG91YmxlKTsKK2RvdWJsZQlleHBtMShkb3VibGUpOworZG91YmxlCWZtYShkb3VibGUsIGRvdWJsZSwgZG91YmxlKTsKK2RvdWJsZQloeXBvdChkb3VibGUsIGRvdWJsZSk7CitpbnQJaWxvZ2IoZG91YmxlKSBfX3B1cmUyOworLyogaW50CShpc2luZikoZG91YmxlKSBfX3B1cmUyOyAqLworaW50CShpc25hbikoZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWxnYW1tYShkb3VibGUpOworbG9uZyBsb25nIGxscmludChkb3VibGUpOworbG9uZyBsb25nIGxscm91bmQoZG91YmxlKTsKK2RvdWJsZQlsb2cxcChkb3VibGUpOworZG91YmxlCWxvZ2IoZG91YmxlKTsKK2xvbmcJbHJpbnQoZG91YmxlKTsKK2xvbmcJbHJvdW5kKGRvdWJsZSk7Citkb3VibGUJbmV4dGFmdGVyKGRvdWJsZSwgZG91YmxlKTsKK2RvdWJsZQlyZW1haW5kZXIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCXJlbXF1byhkb3VibGUsIGRvdWJsZSwgaW50ICopOworZG91YmxlCXJpbnQoZG91YmxlKTsKKy8qICNlbmRpZiAqLyAvKiBfX0JTRF9WSVNJQkxFIHx8IF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5IHx8IF9fWFNJX1ZJU0lCTEUgKi8KKworLyogI2lmIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworZG91YmxlCWowKGRvdWJsZSk7Citkb3VibGUJajEoZG91YmxlKTsKK2RvdWJsZQlqbihpbnQsIGRvdWJsZSk7Citkb3VibGUJc2NhbGIoZG91YmxlLCBkb3VibGUpOworZG91YmxlCXkwKGRvdWJsZSk7Citkb3VibGUJeTEoZG91YmxlKTsKK2RvdWJsZQl5bihpbnQsIGRvdWJsZSk7CisKKy8qICNpZiBfX1hTSV9WSVNJQkxFIDw9IDUwMCB8fCBfX0JTRF9WSVNJQkxFICovCitkb3VibGUJZ2FtbWEoZG91YmxlKTsKKy8qICNlbmRpZiAqLworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgfHwgX19YU0lfVklTSUJMRSAqLworCisvKiAjaWYgX19CU0RfVklTSUJMRSB8fCBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworZG91YmxlCWNvcHlzaWduKGRvdWJsZSwgZG91YmxlKSBfX3B1cmUyOworZG91YmxlCWZkaW0oZG91YmxlLCBkb3VibGUpOworZG91YmxlCWZtYXgoZG91YmxlLCBkb3VibGUpIF9fcHVyZTI7Citkb3VibGUJZm1pbihkb3VibGUsIGRvdWJsZSkgX19wdXJlMjsKK2RvdWJsZQluZWFyYnlpbnQoZG91YmxlKTsKK2RvdWJsZQlyb3VuZChkb3VibGUpOworZG91YmxlCXNjYWxibG4oZG91YmxlLCBsb25nKTsKK2RvdWJsZQlzY2FsYm4oZG91YmxlLCBpbnQpOworZG91YmxlCXRnYW1tYShkb3VibGUpOworZG91YmxlCXRydW5jKGRvdWJsZSk7CisvKiAjZW5kaWYgKi8KKworLyoKKyAqIEJTRCBtYXRoIGxpYnJhcnkgZW50cnkgcG9pbnRzCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFICovCitkb3VibGUJZHJlbShkb3VibGUsIGRvdWJsZSk7CitpbnQJZmluaXRlKGRvdWJsZSkgX19wdXJlMjsKK2ludAlpc25hbmYoZmxvYXQpIF9fcHVyZTI7CisKKy8qCisgKiBSZWVudHJhbnQgdmVyc2lvbiBvZiBnYW1tYSAmIGxnYW1tYTsgcGFzc2VzIHNpZ25nYW0gYmFjayBieSByZWZlcmVuY2UKKyAqIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQ7IHVzZXIgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3Igc2lnbmdhbS4KKyAqLworZG91YmxlCWdhbW1hX3IoZG91YmxlLCBpbnQgKik7Citkb3VibGUJbGdhbW1hX3IoZG91YmxlLCBpbnQgKik7CisKKy8qCisgKiBJRUVFIFRlc3QgVmVjdG9yCisgKi8KK2RvdWJsZQlzaWduaWZpY2FuZChkb3VibGUpOworLyogI2VuZGlmICovIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworLyogZmxvYXQgdmVyc2lvbnMgb2YgQU5TSS9QT1NJWCBmdW5jdGlvbnMgKi8KKy8qI2lmIF9fSVNPX0NfVklTSUJMRSA+PSAxOTk5ICovCitmbG9hdAlhY29zZihmbG9hdCk7CitmbG9hdAlhc2luZihmbG9hdCk7CitmbG9hdAlhdGFuZihmbG9hdCk7CitmbG9hdAlhdGFuMmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWNvc2YoZmxvYXQpOworZmxvYXQJc2luZihmbG9hdCk7CitmbG9hdAl0YW5mKGZsb2F0KTsKKworZmxvYXQJY29zaGYoZmxvYXQpOworZmxvYXQJc2luaGYoZmxvYXQpOworZmxvYXQJdGFuaGYoZmxvYXQpOworCitmbG9hdAlleHAyZihmbG9hdCk7CitmbG9hdAlleHBmKGZsb2F0KTsKK2Zsb2F0CWV4cG0xZihmbG9hdCk7CitmbG9hdAlmcmV4cGYoZmxvYXQsIGludCAqKTsJLyogZnVuZGFtZW50YWxseSAhX19wdXJlMiAqLworaW50CWlsb2diZihmbG9hdCkgX19wdXJlMjsKK2Zsb2F0CWxkZXhwZihmbG9hdCwgaW50KTsKK2Zsb2F0CWxvZzEwZihmbG9hdCk7CitmbG9hdAlsb2cxcGYoZmxvYXQpOworZmxvYXQJbG9nZihmbG9hdCk7CitmbG9hdAltb2RmZihmbG9hdCwgZmxvYXQgKik7CS8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KKworZmxvYXQJcG93ZihmbG9hdCwgZmxvYXQpOworZmxvYXQJc3FydGYoZmxvYXQpOworCitmbG9hdAljZWlsZihmbG9hdCk7CitmbG9hdAlmYWJzZihmbG9hdCkgX19wdXJlMjsKK2Zsb2F0CWZsb29yZihmbG9hdCk7CitmbG9hdAlmbW9kZihmbG9hdCwgZmxvYXQpOworZmxvYXQJcm91bmRmKGZsb2F0KTsKKworZmxvYXQJZXJmZihmbG9hdCk7CitmbG9hdAllcmZjZihmbG9hdCk7CitmbG9hdAloeXBvdGYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWxnYW1tYWYoZmxvYXQpOworCitmbG9hdAlhY29zaGYoZmxvYXQpOworZmxvYXQJYXNpbmhmKGZsb2F0KTsKK2Zsb2F0CWF0YW5oZihmbG9hdCk7CitmbG9hdAljYnJ0ZihmbG9hdCk7CitmbG9hdAlsb2diZihmbG9hdCk7CitmbG9hdAljb3B5c2lnbmYoZmxvYXQsIGZsb2F0KSBfX3B1cmUyOworbG9uZyBsb25nIGxscmludGYoZmxvYXQpOworbG9uZyBsb25nIGxscm91bmRmKGZsb2F0KTsKK2xvbmcJbHJpbnRmKGZsb2F0KTsKK2xvbmcJbHJvdW5kZihmbG9hdCk7CitmbG9hdAluZWFyYnlpbnRmKGZsb2F0KTsKK2Zsb2F0CW5leHRhZnRlcmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXJlbWFpbmRlcmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXJlbXF1b2YoZmxvYXQsIGZsb2F0LCBpbnQgKik7CitmbG9hdAlyaW50ZihmbG9hdCk7CitmbG9hdAlzY2FsYmxuZihmbG9hdCwgbG9uZyk7CitmbG9hdAlzY2FsYm5mKGZsb2F0LCBpbnQpOworZmxvYXQJdHJ1bmNmKGZsb2F0KTsKKworZmxvYXQJZmRpbWYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CWZtYWYoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitmbG9hdAlmbWF4ZihmbG9hdCwgZmxvYXQpIF9fcHVyZTI7CitmbG9hdAlmbWluZihmbG9hdCwgZmxvYXQpIF9fcHVyZTI7CisvKiAjZW5kaWYgKi8KKworLyoKKyAqIGZsb2F0IHZlcnNpb25zIG9mIEJTRCBtYXRoIGxpYnJhcnkgZW50cnkgcG9pbnRzCisgKi8KKy8qICNpZiBfX0JTRF9WSVNJQkxFICovCitmbG9hdAlkcmVtZihmbG9hdCwgZmxvYXQpOworaW50CWZpbml0ZWYoZmxvYXQpIF9fcHVyZTI7CitmbG9hdAlnYW1tYWYoZmxvYXQpOworZmxvYXQJajBmKGZsb2F0KTsKK2Zsb2F0CWoxZihmbG9hdCk7CitmbG9hdAlqbmYoaW50LCBmbG9hdCk7CitmbG9hdAlzY2FsYmYoZmxvYXQsIGZsb2F0KTsKK2Zsb2F0CXkwZihmbG9hdCk7CitmbG9hdAl5MWYoZmxvYXQpOworZmxvYXQJeW5mKGludCwgZmxvYXQpOworCisvKgorICogRmxvYXQgdmVyc2lvbnMgb2YgcmVlbnRyYW50IHZlcnNpb24gb2YgZ2FtbWEgJiBsZ2FtbWE7IHBhc3NlcworICogc2lnbmdhbSBiYWNrIGJ5IHJlZmVyZW5jZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50OyB1c2VyIG11c3QKKyAqIGFsbG9jYXRlIHNwYWNlIGZvciBzaWduZ2FtLgorICovCitmbG9hdAlnYW1tYWZfcihmbG9hdCwgaW50ICopOworZmxvYXQJbGdhbW1hZl9yKGZsb2F0LCBpbnQgKik7CisKKy8qCisgKiBmbG9hdCB2ZXJzaW9uIG9mIElFRUUgVGVzdCBWZWN0b3IKKyAqLworZmxvYXQJc2lnbmlmaWNhbmRmKGZsb2F0KTsKKy8qICNlbmRpZiAqLwkvKiBfX0JTRF9WSVNJQkxFICovIAorCisvKgorICogbG9uZyBkb3VibGUgdmVyc2lvbnMgb2YgSVNPL1BPU0lYIG1hdGggZnVuY3Rpb25zCisgKi8KKy8qICNpZiBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworI2lmIDAKK2xvbmcgZG91YmxlCWFjb3NobChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhY29zbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhc2luaGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXNpbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXRhbjJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlhdGFuaGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJYXRhbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJY2JydGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGRvdWJsZQljZWlsbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQljb3B5c2lnbmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworI2lmIDAKK2xvbmcgZG91YmxlCWNvc2hsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWNvc2wobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZXJmY2wobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZXJmbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlleHAybChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlleHBsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWV4cG0xbChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCWZhYnNsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJZmRpbWwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCWZsb29ybChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlmbWFsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJZm1heGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJZm1pbmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKSBfX3B1cmUyOworI2lmIDAKK2xvbmcgZG91YmxlCWZtb2RsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCWZyZXhwbChsb25nIGRvdWJsZSB2YWx1ZSwgaW50ICopOyAvKiBmdW5kYW1lbnRhbGx5ICFfX3B1cmUyICovCisjaWYgMAorbG9uZyBkb3VibGUJaHlwb3RsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7CisjZW5kaWYKK2ludAkJaWxvZ2JsKGxvbmcgZG91YmxlKSBfX3B1cmUyOworbG9uZyBkb3VibGUJbGRleHBsKGxvbmcgZG91YmxlLCBpbnQpOworI2lmIDAKK2xvbmcgZG91YmxlCWxnYW1tYWwobG9uZyBkb3VibGUpOworbG9uZyBsb25nCWxscmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGxvbmcJbGxyb3VuZGwobG9uZyBkb3VibGUpOworI2lmIDAKK2xvbmcgZG91YmxlCWxvZzEwbChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlsb2cxcGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nMmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nYmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbG9nbChsb25nIGRvdWJsZSk7Citsb25nCQlscmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nCQlscm91bmRsKGxvbmcgZG91YmxlKTsKKyNpZiAwCitsb25nIGRvdWJsZQltb2RmbChsb25nIGRvdWJsZSwgbG9uZyBkb3VibGUgKik7IC8qIGZ1bmRhbWVudGFsbHkgIV9fcHVyZTIgKi8KK2xvbmcgZG91YmxlCW5hbmwoY29uc3QgY2hhciAqKSBfX3B1cmUyOworbG9uZyBkb3VibGUJbmVhcmJ5aW50bChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCW5leHRhZnRlcmwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKK2RvdWJsZQkJbmV4dHRvd2FyZChkb3VibGUsIGxvbmcgZG91YmxlKTsKK2Zsb2F0CQluZXh0dG93YXJkZihmbG9hdCwgbG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJbmV4dHRvd2FyZGwobG9uZyBkb3VibGUsIGxvbmcgZG91YmxlKTsKKyNpZiAwCitsb25nIGRvdWJsZQlwb3dsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlyZW1haW5kZXJsKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlyZW1xdW9sKGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgaW50ICopOworbG9uZyBkb3VibGUJcmludGwobG9uZyBkb3VibGUpOworI2VuZGlmCitsb25nIGRvdWJsZQlyb3VuZGwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJc2NhbGJsbmwobG9uZyBkb3VibGUsIGxvbmcpOworbG9uZyBkb3VibGUJc2NhbGJubChsb25nIGRvdWJsZSwgaW50KTsKKyNpZiAwCitsb25nIGRvdWJsZQlzaW5obChsb25nIGRvdWJsZSk7Citsb25nIGRvdWJsZQlzaW5sKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXNxcnRsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXRhbmhsKGxvbmcgZG91YmxlKTsKK2xvbmcgZG91YmxlCXRhbmwobG9uZyBkb3VibGUpOworbG9uZyBkb3VibGUJdGdhbW1hbChsb25nIGRvdWJsZSk7CisjZW5kaWYKK2xvbmcgZG91YmxlCXRydW5jbChsb25nIGRvdWJsZSk7CisKKy8qICNlbmRpZiAqLyAvKiBfX0lTT19DX1ZJU0lCTEUgPj0gMTk5OSAqLworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICFfTUFUSF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9pbmNsdWRlL3Bvd2VycGMvZmVudi5oIGIvbGlibS9pbmNsdWRlL3Bvd2VycGMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL2luY2x1ZGUvcG93ZXJwYy9mZW52LmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3Bvd2VycGMvZmVudi5oLHYgMS4zIDIwMDUvMDMvMTYgMTk6MDM6NDUgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDMyX3QJZmVudl90OwordHlwZWRlZglfX3VpbnQzMl90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgwMjAwMDAwMAorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwNDAwMDAwMAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgwODAwMDAwMAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDEwMDAwMDAwCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgyMDAwMDAwMAkvKiBhbGwgdHlwZXMgb2YgaW52YWxpZCBGUCBvcHMgKi8KKworLyoKKyAqIFRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZSBoYXMgZXh0cmEgaW52YWxpZCBmbGFncyB0aGF0IGluZGljYXRlIHRoZQorICogc3BlY2lmaWMgdHlwZSBvZiBpbnZhbGlkIG9wZXJhdGlvbiBvY2N1cnJlZC4gIFRoZXNlIGZsYWdzIG1heSBiZQorICogdGVzdGVkLCBzZXQsIGFuZCBjbGVhcmVkLS0tYnV0IG5vdCBtYXNrZWQtLS1zZXBhcmF0ZWx5LiAgQWxsIG9mCisgKiB0aGVzZSBiaXRzIGFyZSBjbGVhcmVkIHdoZW4gRkVfSU5WQUxJRCBpcyBjbGVhcmVkLCBidXQgb25seQorICogRkVfVlhTT0ZUIGlzIHNldCB3aGVuIEZFX0lOVkFMSUQgaXMgZXhwbGljaXRseSBzZXQgaW4gc29mdHdhcmUuCisgKi8KKyNkZWZpbmUJRkVfVlhDVkkJMHgwMDAwMDEwMAkvKiBpbnZhbGlkIGludGVnZXIgY29udmVydCAqLworI2RlZmluZQlGRV9WWFNRUlQJMHgwMDAwMDIwMAkvKiBzcXVhcmUgcm9vdCBvZiBhIG5lZ2F0aXZlICovCisjZGVmaW5lCUZFX1ZYU09GVAkweDAwMDAwNDAwCS8qIHNvZnR3YXJlLXJlcXVlc3RlZCBleGNlcHRpb24gKi8KKyNkZWZpbmUJRkVfVlhWQwkJMHgwMDA4MDAwMAkvKiBvcmRlcmVkIGNvbXBhcmlzb24gaW52b2x2aW5nIE5hTiAqLworI2RlZmluZQlGRV9WWElNWgkweDAwMTAwMDAwCS8qIGluZiAqIDAgKi8KKyNkZWZpbmUJRkVfVlhaRFoJMHgwMDIwMDAwMAkvKiAwIC8gMCAqLworI2RlZmluZQlGRV9WWElESQkweDAwNDAwMDAwCS8qIGluZiAvIGluZiAqLworI2RlZmluZQlGRV9WWElTSQkweDAwODAwMDAwCS8qIGluZiAtIGluZiAqLworI2RlZmluZQlGRV9WWFNOQU4JMHgwMTAwMDAwMAkvKiBvcGVyYXRpb24gb24gYSBzaWduYWxsaW5nIE5hTiAqLworI2RlZmluZQlGRV9BTExfSU5WQUxJRAkoRkVfVlhDVkkgfCBGRV9WWFNRUlQgfCBGRV9WWFNPRlQgfCBGRV9WWFZDIHwgXAorCQkJIEZFX1ZYSU1aIHwgRkVfVlhaRFogfCBGRV9WWElESSB8IEZFX1ZYSVNJIHwgXAorCQkJIEZFX1ZYU05BTiB8IEZFX0lOVkFMSUQpCisjZGVmaW5lCUZFX0FMTF9FWENFUFQJKEZFX0RJVkJZWkVSTyB8IEZFX0lORVhBQ1QgfCBcCisJCQkgRkVfQUxMX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyogUm91bmRpbmcgbW9kZXMgKi8KKyNkZWZpbmUJRkVfVE9ORUFSRVNUCTB4MDAwMAorI2RlZmluZQlGRV9UT1dBUkRaRVJPCTB4MDAwMQorI2RlZmluZQlGRV9VUFdBUkQJMHgwMDAyCisjZGVmaW5lCUZFX0RPV05XQVJECTB4MDAwMworI2RlZmluZQlfUk9VTkRfTUFTSwkoRkVfVE9ORUFSRVNUIHwgRkVfRE9XTldBUkQgfCBcCisJCQkgRkVfVVBXQVJEIHwgRkVfVE9XQVJEWkVSTykKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1hcCBzdGF0dXMgZmxhZyBwb3NpdGlvbnMgdG8gbWFzayBmbGFnIHBvc2l0aW9ucyAqLworI2RlZmluZQlfRlBVU1dfU0hJRlQJMjIKKyNkZWZpbmUJX0VOQUJMRV9NQVNLCSgoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IEZFX0lOVkFMSUQgfCBcCisJCQkgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpID4+IF9GUFVTV19TSElGVCkKKworI2RlZmluZQlfX21mZnMoX19lbnYpCV9fYXNtIF9fdm9sYXRpbGUoIm1mZnMgJTAiIDogIj1mIiAoKihfX2VudikpKQorI2RlZmluZQlfX210ZnNmKF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJtdGZzZiAyNTUsJTAiIDogOiAiZiIgKF9fZW52KSkKKwordW5pb24gX19mcHNjciB7CisJZG91YmxlIF9fZDsKKwlzdHJ1Y3QgeworCQlfX3VpbnQzMl90IF9fanVuazsKKwkJZmVudl90IF9fcmVnOworCX0gX19iaXRzOworfTsKKworc3RhdGljIF9faW5saW5lIGludAorZmVjbGVhcmV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9BTExfSU5WQUxJRDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9fZXhjZXB0czsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0ZmxhZyhmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2ZsYWdwID0gX19yLl9fYml0cy5fX3JlZyAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9BTExfRVhDRVBUOworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+X19leGNlcHRzOworCV9fci5fX2JpdHMuX19yZWcgfD0gKl9fZmxhZ3AgJiBfX2V4Y2VwdHM7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXJhaXNlZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlpZiAoX19leGNlcHRzICYgRkVfSU5WQUxJRCkKKwkJX19leGNlcHRzIHw9IEZFX1ZYU09GVDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgfD0gX19leGNlcHRzOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoX19yLl9fYml0cy5fX3JlZyAmIF9fZXhjZXB0cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0cm91bmQodm9pZCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJcmV0dXJuIChfX3IuX19iaXRzLl9fcmVnICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+X1JPVU5EX01BU0s7CisJX19yLl9fYml0cy5fX3JlZyB8PSBfX3JvdW5kOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2VudnAgPSBfX3IuX19iaXRzLl9fcmVnOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJKl9fZW52cCA9IF9fci5fX2Q7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX3IuX19iaXRzLl9fcmVnID0gKl9fZW52cDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldXBkYXRlZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnICY9IEZFX0FMTF9FWENFUFQ7CisJX19yLl9fYml0cy5fX3JlZyB8PSAqX19lbnZwOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIF9fQlNEX1ZJU0lCTEUKKworc3RhdGljIF9faW5saW5lIGludAorZmVlbmFibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKwlmZW52X3QgX19vbGRtYXNrOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlfX29sZG1hc2sgPSBfX3IuX19iaXRzLl9fcmVnOworCV9fci5fX2JpdHMuX19yZWcgfD0gKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpID4+IF9GUFVTV19TSElGVDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoKF9fb2xkbWFzayAmIF9FTkFCTEVfTUFTSykgPDwgX0ZQVVNXX1NISUZUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJdW5pb24gX19mcHNjciBfX3I7CisJZmVudl90IF9fb2xkbWFzazsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19vbGRtYXNrID0gX19yLl9fYml0cy5fX3JlZzsKKwlfX3IuX19iaXRzLl9fcmVnICY9IH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpID4+IF9GUFVTV19TSElGVCk7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKChfX29sZG1hc2sgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoKF9fci5fX2JpdHMuX19yZWcgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaW5jbHVkZS9zcGFyYzY0L2ZlbnYuaCBiL2xpYm0vaW5jbHVkZS9zcGFyYzY0L2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRjNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pbmNsdWRlL3NwYXJjNjQvZmVudi5oCkBAIC0wLDAgKzEsMjU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcGFyYzY0L2ZlbnYuaCx2IDEuMyAyMDA1LzAzLzE2IDE5OjAzOjQ2IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQ2NF90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50NjRfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTlZBTElECTB4MDAwMDAyMDAKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDAwMDAwNDAKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgwMDAwMDEwMAorI2RlZmluZQlGRV9VTkRFUkZMT1cJMHgwMDAwMDA4MAorI2RlZmluZQlGRV9JTkVYQUNUCTB4MDAwMDAwMjAKKyNkZWZpbmUJRkVfQUxMX0VYQ0VQVAkoRkVfRElWQllaRVJPIHwgRkVfSU5FWEFDVCB8IFwKKwkJCSBGRV9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qCisgKiBSb3VuZGluZyBtb2RlcworICoKKyAqIFdlIGNhbid0IGp1c3QgdXNlIHRoZSBoYXJkd2FyZSBiaXQgdmFsdWVzIGhlcmUsIGJlY2F1c2UgdGhhdCB3b3VsZAorICogbWFrZSBGRV9VUFdBUkQgYW5kIEZFX0RPV05XQVJEIG5lZ2F0aXZlLCB3aGljaCBpcyBub3QgYWxsb3dlZC4KKyAqLworI2RlZmluZQlGRV9UT05FQVJFU1QJMHgwCisjZGVmaW5lCUZFX1RPV0FSRFpFUk8JMHgxCisjZGVmaW5lCUZFX1VQV0FSRAkweDIKKyNkZWZpbmUJRkVfRE9XTldBUkQJMHgzCisjZGVmaW5lCV9ST1VORF9NQVNLCShGRV9UT05FQVJFU1QgfCBGRV9ET1dOV0FSRCB8IFwKKwkJCSBGRV9VUFdBUkQgfCBGRV9UT1dBUkRaRVJPKQorI2RlZmluZQlfUk9VTkRfU0hJRlQJMzAKKworX19CRUdJTl9ERUNMUworCisvKiBEZWZhdWx0IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50ICovCitleHRlcm4gY29uc3QgZmVudl90CV9fZmVfZGZsX2VudjsKKyNkZWZpbmUJRkVfREZMX0VOVgkoJl9fZmVfZGZsX2VudikKKworLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1hcCBzdGF0dXMgZmxhZyBwb3NpdGlvbnMgdG8gbWFzayBmbGFnIHBvc2l0aW9ucyAqLworI2RlZmluZSBfRlBVU1dfU0hJRlQJMTgKKyNkZWZpbmUJX0VOQUJMRV9NQVNLCShGRV9BTExfRVhDRVBUIDw8IF9GUFVTV19TSElGVCkKKworI2RlZmluZQlfX2xkeGZzcihfX3IpCV9fYXNtIF9fdm9sYXRpbGUoImxkeCAlMCwgJSVmc3IiIDogOiAibSIgKF9fcikpCisjZGVmaW5lCV9fc3R4ZnNyKF9fcikJX19hc20gX192b2xhdGlsZSgic3R4ICUlZnNyLCAlMCIgOiAiPW0iICgqKF9fcikpKQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWNsZWFyZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCV9fciAmPSB+X19leGNlcHRzOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRleGNlcHRmbGFnKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJKl9fZmxhZ3AgPSBfX3IgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH5fX2V4Y2VwdHM7CisJX19yIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEluIGNvbnRyYXN0IHdpdGggdGhlIGlhNjQgcGxhdGZvcm0sIGl0IHNlZW1zIHRvIGJlIHdvcnRod2hpbGUgdG8KKyAqIGlubGluZSB0aGlzIGZ1bmN0aW9uIG9uIHNwYXJjNjQgZXZlbiB3aGVuIHRoZSBhcmd1bWVudHMgYXJlIG5vdAorICogY29tcGlsZS10aW1lIGNvbnN0YW50cy4gIFBlcmhhcHMgdGhpcyBkZXBlbmRzIG9uIHRoZSByZWdpc3RlciB3aW5kb3cuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlcmFpc2VleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl2b2xhdGlsZSBkb3VibGUgZDsKKworCS8qCisJICogV2l0aCBhIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgdGhlIEZFTlZfQUNDRVNTIHByYWdtYQorCSAqIHByb3Blcmx5LCBzaW1wbGUgZXhwcmVzc2lvbnMgbGlrZSAnMC4wIC8gMC4wJyBzaG91bGQKKwkgKiBiZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRyYXBzLiAgVW5mb3J0dW5hdGVseSwgd2UKKwkgKiBuZWVkIHRvIGJyaW5nIGEgdm9sYXRpbGUgdmFyaWFibGUgaW50byB0aGUgZXF1YXRpb24KKwkgKiB0byBwcmV2ZW50IGluY29ycmVjdCBvcHRpbWl6YXRpb25zLgorCSAqLworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKSB7CisJCWQgPSAwLjA7CisJCWQgPSAwLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfRElWQllaRVJPKSB7CisJCWQgPSAwLjA7CisJCWQgPSAxLjAgLyBkOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfT1ZFUkZMT1cpIHsKKwkJZCA9IDB4MS5mZnAxMDIzOworCQlkICo9IDIuMDsKKwl9CisJaWYgKF9fZXhjZXB0cyAmIEZFX1VOREVSRkxPVykgeworCQlkID0gMHgxcC0xMDIyOworCQlkIC89IDB4MXAxMDIzOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfSU5FWEFDVCkgeworCQlkID0gMHgxcC0xMDIyOworCQlkICs9IDEuMDsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV0ZXN0ZXhjZXB0KGludCBfX2V4Y2VwdHMpCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoX19yICYgX19leGNlcHRzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRyb3VuZCh2b2lkKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlyZXR1cm4gKChfX3IgPj4gX1JPVU5EX1NISUZUKSAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwlmZW52X3QgX19yOworCisJaWYgKF9fcm91bmQgJiB+X1JPVU5EX01BU0spCisJCXJldHVybiAoLTEpOworCV9fc3R4ZnNyKCZfX3IpOworCV9fciAmPSB+KF9ST1VORF9NQVNLIDw8IF9ST1VORF9TSElGVCk7CisJX19yIHw9IF9fcm91bmQgPDwgX1JPVU5EX1NISUZUOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVnZXRlbnYoZmVudl90ICpfX2VudnApCit7CisKKwlfX3N0eGZzcihfX2VudnApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlaG9sZGV4Y2VwdChmZW52X3QgKl9fZW52cCkKK3sKKwlmZW52X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJKl9fZW52cCA9IF9fcjsKKwlfX3IgJj0gfihGRV9BTExfRVhDRVBUIHwgX0VOQUJMRV9NQVNLKTsKKwlfX2xkeGZzcihfX3IpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCisJX19sZHhmc3IoKl9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmV1cGRhdGVlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisJZmV4Y2VwdF90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCV9fbGR4ZnNyKCpfX2VudnApOworCWZlcmFpc2VleGNlcHQoX19yICYgRkVfQUxMX0VYQ0VQVCk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIF9fQlNEX1ZJU0lCTEUKKworc3RhdGljIF9faW5saW5lIGludAorZmVlbmFibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfciwgX19uZXdfcjsKKworCV9fc3R4ZnNyKCZfX29sZF9yKTsKKwlfX25ld19yID0gX19vbGRfciB8ICgoX19tYXNrICYgRkVfQUxMX0VYQ0VQVCkgPDwgX0ZQVVNXX1NISUZUKTsKKwlfX2xkeGZzcihfX25ld19yKTsKKwlyZXR1cm4gKChfX29sZF9yID4+IF9GUFVTV19TSElGVCkgJiBGRV9BTExfRVhDRVBUKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVkaXNhYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJZmVudl90IF9fb2xkX3IsIF9fbmV3X3I7CisKKwlfX3N0eGZzcigmX19vbGRfcik7CisJX19uZXdfciA9IF9fb2xkX3IgJiB+KChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA8PCBfRlBVU1dfU0hJRlQpOworCV9fbGR4ZnNyKF9fbmV3X3IpOworCXJldHVybiAoKF9fb2xkX3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlyZXR1cm4gKChfX3IgJiBfRU5BQkxFX01BU0spID4+IF9GUFVTV19TSElGVCk7Cit9CisKKyNlbmRpZiAvKiBfX0JTRF9WSVNJQkxFICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiAhX0ZFTlZfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vaXNpbmYuYyBiL2xpYm0vaXNpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE4ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9pc2luZi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlICJzcmMvZnBtYXRoLmgiCisKKy8qCisgKiBYWFggVGhlc2Ugcm91dGluZXMgYmVsb25nIGluIGxpYm0sIGJ1dCB0aGV5IG11c3QgcmVtYWluIGluIGxpYmMgZm9yCisgKiAgICAgYmluYXJ5IGNvbXBhdCB1bnRpbCB3ZSBjYW4gYnVtcCBsaWJtJ3MgbWFqb3IgdmVyc2lvbiBudW1iZXIuCisgKi8KKworaW50CitfX2lzaW5mKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDIwNDcgJiYgdS5iaXRzLm1hbmwgPT0gMCAmJiB1LmJpdHMubWFuaCA9PSAwKTsKK30KKworaW50CitfX2lzaW5mZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDI1NSAmJiB1LmJpdHMubWFuID09IDApOworfQorCitpbnQKK19faXNpbmZsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwltYXNrX25iaXRfbCh1KTsKKyNpZm5kZWYgX19hbHBoYV9fCisJcmV0dXJuICh1LmJpdHMuZXhwID09IDMyNzY3ICYmIHUuYml0cy5tYW5sID09IDAgJiYgdS5iaXRzLm1hbmggPT0gMCk7CisjZWxzZQorCXJldHVybiAodS5iaXRzLmV4cCA9PSAyMDQ3ICYmIHUuYml0cy5tYW5sID09IDAgJiYgdS5iaXRzLm1hbmggPT0gMCk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYWNvcy4zIGIvbGlibS9tYW4vYWNvcy4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDNkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9hY29zLjMKQEAgLTAsMCArMSw5MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWFjb3MuMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hY29zLjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgQUNPUyAzCisuT3MKKy5TaCBOQU1FCisuTm0gYWNvcyAsCisuTm0gYWNvc2YKKy5OZCBhcmMgY29zaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhY29zICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGFjb3NmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhY29zCithbmQgdGhlCisuRm4gYWNvc2YKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBwcmluY2lwYWwgdmFsdWUgb2YgdGhlIGFyYyBjb3NpbmUgb2YKKy5GYSB4IC4KK0EgZG9tYWluIGVycm9yIG9jY3VycyBmb3IgYXJndW1lbnRzIG5vdCBpbiB0aGUgcmFuZ2UKKy5CcSAtMSAsICsxIC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGFjb3MKK2FuZCB0aGUKKy5GbiBhY29zZgorZnVuY3Rpb25zIHJldHVybiB0aGUgYXJjIGNvc2luZSBpbiB0aGUgcmFuZ2UKKy5CcSAwICwgXCooUGkKK3JhZGlhbnMuCitJZjoKKy5CZCAtdW5maWxsZWQgLW9mZnNldCBpbmRlbnQKKy5QZiBcJnwgTnMgQXIgeCBOcyBcJnwgPiAxICwKKy5FZAorLlBwCisuRm4gYWNvcyB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIHJldHVybnMgYW4gXCooTmEuCisuU2ggU0VFIEFMU08KKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgZmVudiAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbiAzICwKKy5YciBzaW5oIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGFjb3MKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYWNvc2guMyBiL2xpYm0vbWFuL2Fjb3NoLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1MzRhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Fjb3NoLjMKQEAgLTAsMCArMSw4MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYWNvc2guMwk1LjIgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hY29zaC4zLHYgMS4xMSAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IEFDT1NIIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhY29zaCAsCisuTm0gYWNvc2hmCisuTmQgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gYWNvc2ggImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gYWNvc2hmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhY29zaAorYW5kIHRoZQorLkZuIGFjb3NoZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGludmVyc2UgaHlwZXJib2xpYyBjb3NpbmUKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYWNvc2gKK2FuZCB0aGUKKy5GbiBhY29zaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mCisuQXIgeCAuCitJZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIDEsCisuRm4gYWNvc2gKK3JhaXNlcyBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBhbmQgcmV0dXJucyBhbiBcKihOYS4KKy5TaCBTRUUgQUxTTworLlhyIGFzaW5oIDMgLAorLlhyIGF0YW5oIDMgLAorLlhyIGV4cCAzICwKKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGFjb3NoCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hc2luLjMgYi9saWJtL21hbi9hc2luLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxODk5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2FzaW4uMwpAQCAtMCwwICsxLDk0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXNpbi4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2FzaW4uMyx2IDEuMTUgMjAwNS8wMS8xNCAyMzoyODoyOCBkYXMgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBBU0lOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhc2luICwKKy5ObSBhc2luZgorLk5kIGFyYyBzaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhc2luICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGFzaW5mICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhc2luCithbmQgdGhlCisuRm4gYXNpbmYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBwcmluY2lwYWwgdmFsdWUgb2YgdGhlIGFyYyBzaW5lIG9mCisuRmEgeCAuCitBIGRvbWFpbiBlcnJvciBvY2N1cnMgZm9yIGFyZ3VtZW50cyBub3QgaW4gdGhlIHJhbmdlCisuQnEgLTEgLCArMSAuCitGb3IgYSBkaXNjdXNzaW9uIG9mIGVycm9yIGR1ZSB0byByb3VuZG9mZiwgc2VlCisuWHIgbWF0aCAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBhc2luCithbmQgdGhlCisuRm4gYXNpbmYKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIGFyYyBzaW5lIGluIHRoZSByYW5nZQorLkJrIC13b3JkcworLkJxIC1cKihQaS8yICwgK1wqKFBpLzIKKy5FaworcmFkaWFucy4KK0lmOgorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorLlBmIFwmfCBOcyBBciB4IE5zIFwmfCA+IDEKKy5FZAorLlBwCisuRm4gYXNpbiB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIHJldHVybnMgYW4gXCooTmEuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgZmVudiAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbiAzICwKKy5YciBzaW5oIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGFzaW4KK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vYXNpbmguMyBiL2xpYm0vbWFuL2FzaW5oLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwZDlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2FzaW5oLjMKQEAgLTAsMCArMSw3OCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXNpbmguMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9hc2luaC4zLHYgMS4xMCAyMDAxLzEwLzEzIDEyOjIzOjIyIGJkZSBFeHAgJAorLlwiCisuRGQgTWF5IDYsIDE5OTEKKy5EdCBBU0lOSCAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXNpbmggLAorLk5tIGFzaW5oZgorLk5kIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhc2luaCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhc2luaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGFzaW5oCithbmQgdGhlCisuRm4gYXNpbmhmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYXNpbmgKK2FuZCB0aGUKKy5GbiBhc2luaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgc2luZSBvZgorLkFyIHggLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvc2ggMyAsCisuWHIgYXRhbmggMyAsCisuWHIgZXhwIDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGFzaW5oCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuLjMgYi9saWJtL21hbi9hdGFuLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2F0YW4uMwpAQCAtMCwwICsxLDg0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpYXRhbi4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2F0YW4uMyx2IDEuMTAgMjAwMS8xMC8xMyAxMjoyMzoyMiBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgQVRBTiAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXRhbiAsCisuTm0gYXRhbmYKKy5OZCBhcmMgdGFuZ2VudCBmdW5jdGlvbnMgb2Ygb25lIHZhcmlhYmxlCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGF0YW4gImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gYXRhbmYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGF0YW4KK2FuZCB0aGUKKy5GbiBhdGFuZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHByaW5jaXBhbCB2YWx1ZSBvZiB0aGUgYXJjIHRhbmdlbnQgb2YKKy5GYSB4IC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGF0YW4KK2FuZCB0aGUKKy5GbiBhdGFuZgorZnVuY3Rpb24gcmV0dXJucyB0aGUgYXJjIHRhbmdlbnQgaW4gdGhlIHJhbmdlCisuQmsgLXdvcmRzCisuQnEgLVwqKFBpLzIgLCArXCooUGkvMgorLkVrCityYWRpYW5zLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gYXRhbgorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuMi4zIGIvbGlibS9tYW4vYXRhbjIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFlMTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vYXRhbjIuMwpAQCAtMCwwICsxLDE4NyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWF0YW4yLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vYXRhbjIuMyx2IDEuMTQgMjAwNS8wMS8yOCAyMToxMzozNCBydSBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IEFUQU4yIDMKKy5PcworLlNoIE5BTUUKKy5ObSBhdGFuMiAsCisuTm0gYXRhbjJmCisuTmQgYXJjIHRhbmdlbnQgZnVuY3Rpb25zIG9mIHR3byB2YXJpYWJsZXMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gYXRhbjIgImRvdWJsZSB5IiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhdGFuMmYgImZsb2F0IHkiICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBhdGFuMgorYW5kIHRoZQorLkZuIGF0YW4yZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHByaW5jaXBhbCB2YWx1ZSBvZiB0aGUgYXJjIHRhbmdlbnQgb2YKKy5GYSB5LyBOcyBBciB4ICwKK3VzaW5nIHRoZSBzaWducyBvZiBib3RoIGFyZ3VtZW50cyB0byBkZXRlcm1pbmUgdGhlIHF1YWRyYW50IG9mCit0aGUgcmV0dXJuIHZhbHVlLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGF0YW4yCithbmQgdGhlCisuRm4gYXRhbjJmCitmdW5jdGlvbnMsIGlmIHN1Y2Nlc3NmdWwsCityZXR1cm4gdGhlIGFyYyB0YW5nZW50IG9mCisuRmEgeS8gTnMgQXIgeAoraW4gdGhlIHJhbmdlCisuQmsgLXdvcmRzCisuQnEgXCYtIE5zIFwqKFBpICwgXCYrIE5zIFwqKFBpCisuRWsKK3JhZGlhbnMuCitIZXJlIGFyZSBzb21lIG9mIHRoZSBzcGVjaWFsIGNhc2VzOgorLkJsIC1jb2x1bW4gYXRhbl8oeSx4KV86PV9fX18gIHNpZ24oeSlfKFBpX2F0YW4yKFh5X3hYKSlfX18KKy5JdCBGbiBhdGFuMiB5IHggTm8gOj0gVGEKKy5GbiBhdGFuIHkveCBUYQoraWYKKy5BciB4Cis+IDAsCisuSXQgVGEgc2lnbiggTnMgQXIgeSBOcyApKihcKihQaSAtCisuRm4gYXRhbiAiXFwqKEJheS94XFwqKEJhIiApIFRhCitpZgorLkFyIHgKKzwgMCwKKy5JdCBUYQorLk5vIDAgVGEKK2lmIHggPSB5ID0gMCwgb3IKKy5JdCBUYQorLlBmIHNpZ24oIEFyIHkgTnMgKSpcXCooUGkvMiBUYQoraWYKKy5BciB4Cis9IDAgXCghPQorLkFyIHkgLgorLkVsCisuU2ggTk9URVMKK1RoZSBmdW5jdGlvbgorLkZuIGF0YW4yCitkZWZpbmVzICJpZiB4ID4gMCwiCisuRm4gYXRhbjIgMCAwCis9IDAgZGVzcGl0ZSB0aGF0IHByZXZpb3VzbHkKKy5GbiBhdGFuMiAwIDAKK21heSBoYXZlIGdlbmVyYXRlZCBhbiBlcnJvciBtZXNzYWdlLgorVGhlIHJlYXNvbnMgZm9yIGFzc2lnbmluZyBhIHZhbHVlIHRvCisuRm4gYXRhbjIgMCAwCithcmUgdGhlc2U6CisuQmwgLWVudW0gLW9mZnNldCBpbmRlbnQKKy5JdAorUHJvZ3JhbXMgdGhhdCB0ZXN0IGFyZ3VtZW50cyB0byBhdm9pZCBjb21wdXRpbmcKKy5GbiBhdGFuMiAwIDAKK211c3QgYmUgaW5kaWZmZXJlbnQgdG8gaXRzIHZhbHVlLgorUHJvZ3JhbXMgdGhhdCByZXF1aXJlIGl0IHRvIGJlIGludmFsaWQgYXJlIHZ1bG5lcmFibGUKK3RvIGRpdmVyc2UgcmVhY3Rpb25zIHRvIHRoYXQgaW52YWxpZGl0eSBvbiBkaXZlcnNlIGNvbXB1dGVyIHN5c3RlbXMuCisuSXQKK1RoZQorLkZuIGF0YW4yCitmdW5jdGlvbiBpcyB1c2VkIG1vc3RseSB0byBjb252ZXJ0IGZyb20gcmVjdGFuZ3VsYXIgKHgseSkKK3RvIHBvbGFyCisuaWYgblwKKyhyLHRoZXRhKQorLmlmIHRcCisocixcKCpoKQorY29vcmRpbmF0ZXMgdGhhdCBtdXN0IHNhdGlzZnkgeCA9CisuaWYgblwKK3JcKCoqY29zIHRoZXRhCisuaWYgdFwKK3JcKCoqY29zXCgqaAorYW5kIHkgPQorLmlmIG5cCityXCgqKnNpbiB0aGV0YS4KKy5pZiB0XAorclwoKipzaW5cKCpoLgorVGhlc2UgZXF1YXRpb25zIGFyZSBzYXRpc2ZpZWQgd2hlbiAoeD0wLHk9MCkKK2lzIG1hcHBlZCB0bworLmlmIG4gXAorKHI9MCx0aGV0YT0wKS4KKy5pZiB0IFwKKyhyPTAsXCgqaD0wKS4KK0luIGdlbmVyYWwsIGNvbnZlcnNpb25zIHRvIHBvbGFyIGNvb3JkaW5hdGVzCitzaG91bGQgYmUgY29tcHV0ZWQgdGh1czoKKy5CZCAtdW5maWxsZWQgLW9mZnNldCBpbmRlbnQKKy5pZiBuIFx7XAorcgk6PSBoeXBvdCh4LHkpOyAgLi4uIDo9IHNxcnQoeFwoKip4K3lcKCoqeSkKK3RoZXRhCTo9IGF0YW4yKHkseCkuCisuXH0KKy5pZiB0IFx7XAorcgk6PSBoeXBvdCh4LHkpOyAgLi4uIDo9IFwoc3IoeFx1XHM4MlxzMTBcZCt5XHVcczgyXHMxMFxkKQorXCgqaAk6PSBhdGFuMih5LHgpLgorLlx9CisuRWQKKy5JdAorVGhlIGZvcmVnb2luZyBmb3JtdWxhcyBuZWVkIG5vdCBiZSBhbHRlcmVkIHRvIGNvcGUgaW4gYQorcmVhc29uYWJsZSB3YXkgd2l0aCBzaWduZWQgemVyb3MgYW5kIGluZmluaXRpZXMKK29uIGEgbWFjaGluZSB0aGF0IGNvbmZvcm1zIHRvCisuVG4gSUVFRSA3NTQgOwordGhlIHZlcnNpb25zIG9mCisuWHIgaHlwb3QgMworYW5kCisuRm4gYXRhbjIKK3Byb3ZpZGVkIGZvcgorc3VjaCBhIG1hY2hpbmUgYXJlIGRlc2lnbmVkIHRvIGhhbmRsZSBhbGwgY2FzZXMuCitUaGF0IGlzIHdoeQorLkZuIGF0YW4yIFwoKy0wIFwtMAorPSBcKCstXCooUGkKK2ZvciBpbnN0YW5jZS4KK0luIGdlbmVyYWwgdGhlIGZvcm11bGFzIGFib3ZlIGFyZSBlcXVpdmFsZW50IHRvIHRoZXNlOgorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorLmlmIG4gXAorciA6PSBzcXJ0KHhcKCoqeCt5XCgqKnkpOyBpZiByID0gMCB0aGVuIHggOj0gY29weXNpZ24oMSx4KTsKKy5pZiB0IFwKK3IgOj0gXChzcih4XCgqKngreVwoKip5KTtcMFwwaWYgciA9IDAgdGhlbiB4IDo9IGNvcHlzaWduKDEseCk7CisuRWQKKy5FbAorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBhdGFuMgorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9hdGFuaC4zIGIvbGlibS9tYW4vYXRhbmguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNjMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vYXRhbmguMwpAQCAtMCwwICsxLDg1IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylhdGFuaC4zCTUuMiAoQmVya2VsZXkpIDUvNi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2F0YW5oLjMsdiAxLjEzIDIwMDUvMDEvMjggMjE6MTQ6MTYgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBBVEFOSCAzCisuT3MKKy5TaCBOQU1FCisuTm0gYXRhbmggLAorLk5tIGF0YW5oZgorLk5kIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBhdGFuaCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBhdGFuaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGF0YW5oCithbmQgdGhlCisuRm4gYXRhbmhmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHRhbmdlbnQKK29mIHRoZSByZWFsCithcmd1bWVudAorLkFyIHggLgorRm9yIGEgZGlzY3Vzc2lvbiBvZiBlcnJvciBkdWUgdG8gcm91bmRvZmYsIHNlZQorLlhyIG1hdGggMyAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gYXRhbmgKK2FuZCB0aGUKKy5GbiBhdGFuaGYKK2Z1bmN0aW9ucworcmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCBvZgorLkFyIHgKK2lmIHN1Y2Nlc3NmdWwuCitJZiB0aGUgYXJndW1lbnQgaGFzIGFic29sdXRlIHZhbHVlIDEsIGEgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uCitpcyByYWlzZWQgYW5kIGFuIGluZmluaXR5IGlzIHJldHVybmVkLgorSWYKKy5BciB8eHwKKz4gMSwgYW4gaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCBhbiBcKihOYSBpcyByZXR1cm5lZC4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3NoIDMgLAorLlhyIGFzaW5oIDMgLAorLlhyIGV4cCAzICwKKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIEhJU1RPUlkKK1RoZQorLkZuIGF0YW5oCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9jZWlsLjMgYi9saWJtL21hbi9jZWlsLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3OTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2NlaWwuMwpAQCAtMCwwICsxLDgyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpY2VpbC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2NlaWwuMyx2IDEuMTUgMjAwNS8wMS8xMyAyMDozMzo0MiBzdGVmYW5mIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDEzLCAyMDA1CisuRHQgQ0VJTCAzCisuT3MKKy5TaCBOQU1FCisuTm0gY2VpbCAsCisuTm0gY2VpbGYgLAorLk5tIGNlaWxsCisuTmQgc21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHgKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gY2VpbCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBjZWlsZiAiZmxvYXQgeCIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gY2VpbGwgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGNlaWwgLAorLkZuIGNlaWxmCithbmQKKy5GbiBjZWlsbAorZnVuY3Rpb25zIHJldHVybiB0aGUgc21hbGxlc3QgaW50ZWdyYWwgdmFsdWUKK2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworLkZhIHggLAorZXhwcmVzc2VkIGFzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorLlNoIFNFRSBBTFNPCisuWHIgYWJzIDMgLAorLlhyIGZhYnMgMyAsCisuWHIgZmxvb3IgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMyAsCisuWHIgdHJ1bmMgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY2VpbAorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCitUaGUKKy5GbiBjZWlsZgorYW5kCisuRm4gY2VpbGwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vY2ltYWcuMyBiL2xpYm0vbWFuL2NpbWFnLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5ZTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2NpbWFnLjMKQEAgLTAsMCArMSw5NiBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9jaW1hZy4zLHYgMS4yIDIwMDUvMDEvMTMgMTA6NDM6MDEgcnUgRXhwICQKKy5cIgorLkRkIEF1Z3VzdCA3LCAyMDA0CisuRHQgQ0lNQUcgMworLk9zCisuU2ggTkFNRQorLk5tIGNpbWFnICwgY2ltYWdmICwgY2ltYWdsICwKKy5ObSBjb25qICwgY29uamYgLCBjb25qbCAsCisuTm0gY3JlYWwgLCBjcmVhbGYgLCBjcmVhbGwKKy5OZCAiZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgY29tcGxleCBudW1iZXJzIgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBjb21wbGV4LmgKKy5GdCBkb3VibGUKKy5GbiBjaW1hZyAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCBmbG9hdAorLkZuIGNpbWFnZiAiZmxvYXQgY29tcGxleCB6IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiBjaW1hZ2wgImxvbmcgZG91YmxlIGNvbXBsZXggeiIKKy5GdCAiZG91YmxlIGNvbXBsZXgiCisuRm4gY29uaiAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCAiZmxvYXQgY29tcGxleCIKKy5GbiBjb25qZiAiZmxvYXQgY29tcGxleCB6IgorLkZ0ICJsb25nIGRvdWJsZSBjb21wbGV4IgorLkZuIGNvbmpsICJsb25nIGRvdWJsZSBjb21wbGV4IHoiCisuRnQgZG91YmxlCisuRm4gY3JlYWwgImRvdWJsZSBjb21wbGV4IHoiCisuRnQgZmxvYXQKKy5GbiBjcmVhbGYgImZsb2F0IGNvbXBsZXggeiIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gY3JlYWxsICJsb25nIGRvdWJsZSBjb21wbGV4IHoiCisuU2ggREVTQ1JJUFRJT04KK0xldAorLlNtIG9mZgorLkZhIGEgKyBiICogRW0gaQorLlNtIG9uCitkZW5vdGUgdGhlIGNvbXBsZXggbnVtYmVyCisuRmEgeiAuCisuUHAKK1RoZQorLkZuIGNpbWFnCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbWFnaW5hcnkgcGFydAorLkZhIGIgLgorLlBwCitUaGUKKy5GbiBjb25qCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZQorLlNtIG9mZgorLkZhIGEgLSBiICogRW0gaSAuCisuU20gb24KKy5QcAorVGhlCisuRm4gY3JlYWwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHJlYWwgcGFydAorLkZhIGEgLgorLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY2ltYWcgLAorLkZuIGNvbmoKK2FuZAorLkZuIGNyZWFsCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjaW1hZyAsCisuRm4gY29uagorYW5kCisuRm4gY3JlYWwKK2Z1bmN0aW9ucyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9jb3B5c2lnbi4zIGIvbGlibS9tYW4vY29weXNpZ24uMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NlM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vY29weXNpZ24uMwpAQCAtMCwwICsxLDkwIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vY29weXNpZ24uMyx2IDEuMSAyMDA1LzAxLzI3IDA1OjQ2OjE2IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAyNiwgMjAwNQorLkR0IENPUFlTSUdOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBjb3B5c2lnbiAsCisuTm0gY29weXNpZ25mICwKKy5ObSBjb3B5c2lnbmwKKy5OZCBjb3B5IHNpZ24KKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gY29weXNpZ24gImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBjb3B5c2lnbmYgImZsb2F0IHgiICJmbG9hdCB5IgorLkZ0IGxvbmcgZG91YmxlCisuRm4gY29weXNpZ25sICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gY29weXNpZ24gLAorLkZuIGNvcHlzaWduZgorYW5kCisuRm4gY29weXNpZ25sCitmdW5jdGlvbnMKK3JldHVybgorLkZhIHgKK3dpdGggaXRzIHNpZ24gY2hhbmdlZCB0bworLkZhIHkgTnMgJ3MgLgorLlNoIFNFRSBBTFNPCisuWHIgZmFicyAzICwKKy5YciBmZGltIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBjb3B5c2lnbiAsCisuRm4gY29weXNpZ25mICwKK2FuZAorLkZuIGNvcHlzaWdubAorcm91dGluZXMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KK1RoZXkgaW1wbGVtZW50IHRoZSBDb3B5c2lnbiBmdW5jdGlvbiByZWNvbW1lbmRlZCBieQorLlN0IC1pZWVlNzU0IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjb3B5c2lnbiAsCisuRm4gY29weXNpZ25mICwKK2FuZAorLkZuIGNvcHlzaWdubAorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zICwKKy5GeCAyLjAgLAorYW5kCisuRnggNS4zICwKK3Jlc3BlY3RpdmVseS4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2Nvcy4zIGIvbGlibS9tYW4vY29zLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwYmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Nvcy4zCkBAIC0wLDAgKzEsODMgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyljb3MuMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9jb3MuMyx2IDEuMTEgMjAwMS8xMC8xMyAxMjoyMzoyMyBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgQ09TIDMKKy5PcworLlNoIE5BTUUKKy5ObSBjb3MgLAorLk5tIGNvc2YKKy5OZCBjb3NpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNvcyAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBjb3NmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBjb3MKK2FuZCB0aGUKKy5GbiBjb3NmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgY29zaW5lIG9mCisuRmEgeAorKG1lYXN1cmVkIGluIHJhZGlhbnMpLgorQSBsYXJnZSBtYWduaXR1ZGUgYXJndW1lbnQgbWF5IHlpZWxkIGEgcmVzdWx0IHdpdGggbGl0dGxlIG9yIG5vCitzaWduaWZpY2FuY2UuCitGb3IgYSBkaXNjdXNzaW9uIG9mIGVycm9yIGR1ZSB0byByb3VuZG9mZiwgc2VlCisuWHIgbWF0aCAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBjb3MKK2FuZCB0aGUKKy5GbiBjb3NmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb3NpbmUgdmFsdWUuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gY29zCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2Nvc2guMyBiL2xpYm0vbWFuL2Nvc2guMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjMzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vY29zaC4zCkBAIC0wLDAgKzEsNzIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyljb3NoLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vY29zaC4zLHYgMS4xMiAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IENPU0ggMworLk9zCisuU2ggTkFNRQorLk5tIGNvc2ggLAorLk5tIGNvc2hmCisuTmQgaHlwZXJib2xpYyBjb3NpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNvc2ggImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gY29zaGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGNvc2gKK2FuZCB0aGUKKy5GbiBjb3NoZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mCisuRmEgeCAuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3MgMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBjb3NoCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2VyZi4zIGIvbGlibS9tYW4vZXJmLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0Nzg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2VyZi4zCkBAIC0wLDAgKzEsOTcgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWVyZi4zCTYuNCAoQmVya2VsZXkpIDQvMjAvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9lcmYuMyx2IDEuMTEgMjAwNC8wNy8wMiAyMzo1MjoyMCBydSBFeHAgJAorLlwiCisuRGQgQXByaWwgMjAsIDE5OTEKKy5EdCBFUkYgMworLk9zCisuU2ggTkFNRQorLk5tIGVyZiAsCisuTm0gZXJmZiAsCisuTm0gZXJmYyAsCisuTm0gZXJmY2YKKy5OZCBlcnJvciBmdW5jdGlvbiBvcGVyYXRvcnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZXJmICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGVyZmYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gZXJmYyAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBlcmZjZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgZXJyb3IgZnVuY3Rpb24gb2YKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gZXJmCithbmQgdGhlCisuRm4gZXJmZgorZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgZXJyb3IgZnVuY3Rpb24gb2YgeDsgd2hlcmUKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50CisuaWYgbiBce1wKK2VyZih4KSA9IDIvc3FydChwaSlcKCoqXHxpbnRlZ3JhbCBmcm9tIDAgdG8geCBvZiBleHAoXC10XCgqKnQpIGR0LgorXH0KKy5pZiB0IFx7XAorZXJmXHwoeCkgOj0KKygyL1woc3JcKCpwKVx8XChpc1xkXHM4XHowXHMxMFx1XHVcczh4XHMxMFxkXHxleHAoXC10XHVcczgyXHMxMFxkKVx8ZHQuCitcfQorLkVkCisuUHAKK1RoZQorLkZuIGVyZmMKK2FuZCB0aGUKKy5GbiBlcmZjZgorZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBvZgorLkZhIHggOwordGhhdCBpcworLkZuIGVyZmMKK3N1YnRyYWN0cyB0aGUgcmVzdWx0IG9mIHRoZSBlcnJvciBmdW5jdGlvbgorLkZuIGVyZiB4Citmcm9tIDEuMC4KK1RoaXMgaXMgdXNlZnVsLCBzaW5jZSBmb3IgbGFyZ2UKKy5GYSB4CitwbGFjZXMgZGlzYXBwZWFyLgorLlNoIFNFRSBBTFNPCisuWHIgbWF0aCAzCisuU2ggSElTVE9SWQorVGhlCisuRm4gZXJmCithbmQKKy5GbiBlcmZjCitmdW5jdGlvbnMgYXBwZWFyZWQgaW4KKy5CeCA0LjMgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZXhwLjMgYi9saWJtL21hbi9leHAuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFlZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZXhwLjMKQEAgLTAsMCArMSwyMzYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWV4cC4zCTYuMTIgKEJlcmtlbGV5KSA3LzMxLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZXhwLjMsdiAxLjIyIDIwMDUvMDQvMDUgMDI6NTc6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBBcHJpbCA1LCAyMDA1CisuRHQgRVhQIDMKKy5PcworLlNoIE5BTUUKKy5ObSBleHAgLAorLk5tIGV4cGYgLAorLlwiIFRoZSBzb3J0aW5nIGVycm9yIGlzIGludGVudGlvbmFsLiAgZXhwIGFuZCBleHBmIHNob3VsZCBiZSBhZGphY2VudC4KKy5ObSBleHAyICwKKy5ObSBleHAyZiAsCisuTm0gZXhwbTEgLAorLk5tIGV4cG0xZiAsCisuTm0gbG9nICwKKy5ObSBsb2dmICwKKy5ObSBsb2cxMCAsCisuTm0gbG9nMTBmICwKKy5ObSBsb2cxcCAsCisuTm0gbG9nMXBmICwKKy5ObSBwb3cgLAorLk5tIHBvd2YKKy5OZCBleHBvbmVudGlhbCwgbG9nYXJpdGhtLCBwb3dlciBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZXhwICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGV4cGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gZXhwMiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBleHAyZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiBleHBtMSAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBleHBtMWYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gbG9nICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGxvZ2YgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gbG9nMTAgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gbG9nMTBmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIGxvZzFwICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIGxvZzFwZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiBwb3cgImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBwb3dmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZXhwCithbmQgdGhlCisuRm4gZXhwZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGJhc2UKKy5NcyBlCitleHBvbmVudGlhbCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gZXhwMgorYW5kIHRoZQorLkZuIGV4cDJmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgYmFzZSAyIGV4cG9uZW50aWFsIG9mIHRoZSBnaXZlbiBhcmd1bWVudAorLkZhIHggLgorLlBwCitUaGUKKy5GbiBleHBtMQorYW5kIHRoZQorLkZuIGV4cG0xZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIGV4cCh4KVwtMSBhY2N1cmF0ZWx5IGV2ZW4gZm9yIHRpbnkgYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gbG9nCithbmQgdGhlCisuRm4gbG9nZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBhcmd1bWVudAorLkZhIHggLgorLlBwCitUaGUKKy5GbiBsb2cxMAorYW5kIHRoZQorLkZuIGxvZzEwZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBsb2dhcml0aG0gb2YgYXJndW1lbnQKKy5GYSB4Cit0byBiYXNlIDEwLgorLlBwCitUaGUKKy5GbiBsb2cxcAorYW5kIHRoZQorLkZuIGxvZzFwZgorZnVuY3Rpb25zIGNvbXB1dGUKK3RoZSB2YWx1ZSBvZiBsb2coMSt4KSBhY2N1cmF0ZWx5IGV2ZW4gZm9yIHRpbnkgYXJndW1lbnQKKy5GYSB4IC4KKy5QcAorVGhlCisuRm4gcG93CithbmQgdGhlCisuRm4gcG93ZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHZhbHVlCitvZgorLkFyIHgKK3RvIHRoZSBleHBvbmVudAorLkFyIHkgLgorLlNoIEVSUk9SIChkdWUgdG8gUm91bmRvZmYgZXRjLikKK1RoZSB2YWx1ZXMgb2YKKy5GbiBleHAgMCAsCisuRm4gZXhwbTEgMCAsCisuRm4gZXhwMiBpbnRlZ2VyICwKK2FuZAorLkZuIHBvdyBpbnRlZ2VyIGludGVnZXIKK2FyZSBleGFjdCBwcm92aWRlZCB0aGF0IHRoZXkgYXJlIHJlcHJlc2VudGFibGUuCisuXCIgWFhYIElzIHRoaXMgcmVhbGx5IHRydWUgZm9yIHBvdygpPworT3RoZXJ3aXNlIHRoZSBlcnJvciBpbiB0aGVzZSBmdW5jdGlvbnMgaXMgZ2VuZXJhbGx5IGJlbG93IG9uZQorLkVtIHVscCAuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlc2UgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBjb21wdXRhdGlvbiB1bmxlc3MgYW4gZXJyb3IKK29jY3VycyBvciBhbiBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2UuCitUaGUgZnVuY3Rpb25zCisuRm4gcG93IHggeQorYW5kCisuRm4gcG93ZiB4IHkKK3JhaXNlIGFuIGludmFsaWQgZXhjZXB0aW9uIGFuZCByZXR1cm4gYW4gXCooTmEgaWYKKy5GYSB4Cis8IDAgYW5kCisuRmEgeQoraXMgbm90IGFuIGludGVnZXIuCitBbiBhdHRlbXB0IHRvIHRha2UgdGhlIGxvZ2FyaXRobSBvZiBcKihQbTAgd2lsbCByZXN1bHQgaW4KK2EgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uLCBhbmQgYW4gaW5maW5pdHkgd2lsbCBiZSByZXR1cm5lZC4KK0FuIGF0dGVtcHQgdG8gdGFrZSB0aGUgbG9nYXJpdGhtIG9mIGEgbmVnYXRpdmUgbnVtYmVyIHdpbGwKK3Jlc3VsdCBpbiBhbiBpbnZhbGlkIGV4Y2VwdGlvbiwgYW5kIGFuIFwqKE5hIHdpbGwgYmUgZ2VuZXJhdGVkLgorLlNoIE5PVEVTCitUaGUgZnVuY3Rpb25zIGV4cCh4KVwtMSBhbmQgbG9nKDEreCkgYXJlIGNhbGxlZAorZXhwbTEgYW5kIGxvZ3AxIGluCisuVG4gQkFTSUMKK29uIHRoZSBIZXdsZXR0XC1QYWNrYXJkCisuVG4gSFAgTnMgXC03MUIKK2FuZAorLlRuIEFQUExFCitNYWNpbnRvc2gsCisuVG4gRVhQMQorYW5kCisuVG4gTE4xCitpbiBQYXNjYWwsIGV4cDEgYW5kIGxvZzEgaW4gQworb24KKy5UbiBBUFBMRQorTWFjaW50b3NoZXMsIHdoZXJlIHRoZXkgaGF2ZSBiZWVuIHByb3ZpZGVkIHRvIG1ha2UKK3N1cmUgZmluYW5jaWFsIGNhbGN1bGF0aW9ucyBvZiAoKDEreCkqKm5cLTEpL3gsIG5hbWVseQorZXhwbTEoblwoKipsb2cxcCh4KSkveCwgd2lsbCBiZSBhY2N1cmF0ZSB3aGVuIHggaXMgdGlueS4KK1RoZXkgYWxzbyBwcm92aWRlIGFjY3VyYXRlIGludmVyc2UgaHlwZXJib2xpYyBmdW5jdGlvbnMuCisuUHAKK1RoZSBmdW5jdGlvbgorLkZuIHBvdyB4IDAKK3JldHVybnMgeCoqMCA9IDEgZm9yIGFsbCB4IGluY2x1ZGluZyB4ID0gMCwgXCooSWYsIGFuZCBcKihOYSAuCitQcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgcG93IG1heQoraGF2ZSBkZWZpbmVkIHgqKjAgdG8gYmUgdW5kZWZpbmVkIGluIHNvbWUgb3IgYWxsIG9mIHRoZXNlCitjYXNlcy4KK0hlcmUgYXJlIHJlYXNvbnMgZm9yIHJldHVybmluZyB4KiowID0gMSBhbHdheXM6CisuQmwgLWVudW0gLXdpZHRoIGluZGVudAorLkl0CitBbnkgcHJvZ3JhbSB0aGF0IGFscmVhZHkgdGVzdHMgd2hldGhlciB4IGlzIHplcm8gKG9yCitpbmZpbml0ZSBvciBcKihOYSkgYmVmb3JlIGNvbXB1dGluZyB4KiowIGNhbm5vdCBjYXJlCit3aGV0aGVyIDAqKjAgPSAxIG9yIG5vdC4KK0FueSBwcm9ncmFtIHRoYXQgZGVwZW5kcwordXBvbiAwKiowIHRvIGJlIGludmFsaWQgaXMgZHViaW91cyBhbnl3YXkgc2luY2UgdGhhdAorZXhwcmVzc2lvbidzIG1lYW5pbmcgYW5kLCBpZiBpbnZhbGlkLCBpdHMgY29uc2VxdWVuY2VzCit2YXJ5IGZyb20gb25lIGNvbXB1dGVyIHN5c3RlbSB0byBhbm90aGVyLgorLkl0CitTb21lIEFsZ2VicmEgdGV4dHMgKGUuZy5cJiBTaWdsZXIncykgZGVmaW5lIHgqKjAgPSAxIGZvcgorYWxsIHgsIGluY2x1ZGluZyB4ID0gMC4KK1RoaXMgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb252ZW50aW9uIHRoYXQgYWNjZXB0cyBhWzBdCithcyB0aGUgdmFsdWUgb2YgcG9seW5vbWlhbAorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitwKHgpID0gYVswXVwoKip4KiowICsgYVsxXVwoKip4KioxICsgYVsyXVwoKip4KioyICsuLi4rIGFbbl1cKCoqeCoqbgorLkVkCisuUHAKK2F0IHggPSAwIHJhdGhlciB0aGFuIHJlamVjdCBhWzBdXCgqKjAqKjAgYXMgaW52YWxpZC4KKy5JdAorQW5hbHlzdHMgd2lsbCBhY2NlcHQgMCoqMCA9IDEgZGVzcGl0ZSB0aGF0IHgqKnkgY2FuCithcHByb2FjaCBhbnl0aGluZyBvciBub3RoaW5nIGFzIHggYW5kIHkgYXBwcm9hY2ggMAoraW5kZXBlbmRlbnRseS4KK1RoZSByZWFzb24gZm9yIHNldHRpbmcgMCoqMCA9IDEgYW55d2F5IGlzIHRoaXM6CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudAorSWYgeCh6KSBhbmQgeSh6KSBhcmUKKy5FbSBhbnkKK2Z1bmN0aW9ucyBhbmFseXRpYyAoZXhwYW5kYWJsZQoraW4gcG93ZXIgc2VyaWVzKSBpbiB6IGFyb3VuZCB6ID0gMCwgYW5kIGlmIHRoZXJlCit4KDApID0geSgwKSA9IDAsIHRoZW4geCh6KSoqeSh6KSBcKC0+IDEgYXMgeiBcKC0+IDAuCisuRWQKKy5JdAorSWYgMCoqMCA9IDEsIHRoZW4KK1wqKElmKiowID0gMS8wKiowID0gMSB0b287IGFuZAordGhlbiBcKihOYSoqMCA9IDEgdG9vIGJlY2F1c2UgeCoqMCA9IDEgZm9yIGFsbCBmaW5pdGUKK2FuZCBpbmZpbml0ZSB4LCBpLmUuLCBpbmRlcGVuZGVudGx5IG9mIHguCisuRWwKKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgbWF0aCAzCmRpZmYgLS1naXQgYS9saWJtL21hbi9mYWJzLjMgYi9saWJtL21hbi9mYWJzLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiM2EyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZhYnMuMwpAQCAtMCwwICsxLDg3IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiCUAoIylmYWJzLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylmYWJzLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmFicy4zLHYgMS4xMSAyMDA0LzA3LzAxIDE4OjIwOjU3IHJ1IEV4cCAkCisuXCIKKy5EZCBPY3RvYmVyIDI1LCAyMDAzCisuRHQgRkFCUyAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmFicyAsCisuTm0gZmFic2YgLAorLk5tIGZhYnNsCisuTmQgZmxvYXRpbmctcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGZhYnMgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gZmFic2YgImZsb2F0IHgiCisuRnQgbG9uZyBkb3VibGUKKy5GbiBmYWJzbCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmFicyAsCisuRm4gZmFic2YKK2FuZAorLkZuIGZhYnNsCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKy5GYSB4IC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBmYWJzICwKKy5GbiBmYWJzZgorYW5kCisuRm4gZmFic2wKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mCisuRmEgeCAuCisuU2ggU0VFIEFMU08KKy5YciBhYnMgMyAsCisuWHIgY2VpbCAzICwKKy5YciBmbG9vciAzICwKKy5YciBpZWVlIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcmludCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmYWJzCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KK1RoZQorLkZuIGZhYnNmCithbmQKKy5GbiBmYWJzbAorZnVuY3Rpb25zIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mZGltLjMgYi9saWJtL21hbi9mZGltLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZTVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZkaW0uMwpAQCAtMCwwICsxLDg2IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmRpbS4zLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkCisuXCIKKy5EZCBKdW5lIDI5LCAyMDA0CisuRHQgRkRJTSAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmRpbSAsCisuTm0gZmRpbWYgLAorLk5tIGZkaW1sCisuTmQgcG9zaXRpdmUgZGlmZmVyZW5jZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZmRpbSAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZkaW1mICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIGZkaW1sICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmRpbSAsCisuRm4gZmRpbWYgLAorYW5kCisuRm4gZmRpbWwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbgorLkZhIHgKK2FuZAorLkZhIHkgLgorVGhhdCBpcywgaWYKKy5GYSB4XC0gTnMgRmEgeQoraXMgcG9zaXRpdmUsIHRoZW4KKy5GYSB4XC0gTnMgRmEgeQoraXMgcmV0dXJuZWQuCitJZiBlaXRoZXIKKy5GYSB4CitvcgorLkZhIHkKK2lzIGFuIFwqKE5hLCB0aGVuIGFuIFwqKE5hIGlzIHJldHVybmVkLgorT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzCisuTGkgKzAuMCAuCisuUHAKK092ZXJmbG93IG9yIHVuZGVyZmxvdyBtYXkgb2NjdXIgaWZmIHRoZSBleGFjdCByZXN1bHQgaXMgbm90CityZXByZXNlbnRhYmxlIGluIHRoZSByZXR1cm4gdHlwZS4KK05vIG90aGVyIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZC4KKy5TaCBTRUUgQUxTTworLlhyIGZhYnMgMyAsCisuWHIgZm1heCAzICwKKy5YciBmbWluIDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZmRpbSAsCisuRm4gZmRpbWYgLAorYW5kCisuRm4gZmRpbWwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlY2xlYXJleGNlcHQuMyBiL2xpYm0vbWFuL2ZlY2xlYXJleGNlcHQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNkZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZmVjbGVhcmV4Y2VwdC4zCkBAIC0wLDAgKzEsMTM5IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVjbGVhcmV4Y2VwdC4zLHYgMS4zIDIwMDUvMDEvMTQgMDk6MTI6MDUgcnUgRXhwICQKKy5cIgorLkRkIE1heSA4LCAyMDA0CisuRHQgRkVDTEVBUkVYQ0VQVCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVjbGVhcmV4Y2VwdCAsCisuTm0gZmVnZXRleGNlcHRmbGFnICwKKy5ObSBmZXJhaXNlZXhjZXB0ICwKKy5ObSBmZXNldGV4Y2VwdGZsYWcgLAorLk5tIGZldGVzdGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFnIG1hbmlwdWxhdGlvbgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBmZW52LmgKKy5GZCAiI3ByYWdtYSBTVERDIEZFTlZfQUNDRVNTIE9OIgorLkZ0IGludAorLkZuIGZlY2xlYXJleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZ2V0ZXhjZXB0ZmxhZyAiZmV4Y2VwdF90ICpmbGFncCIgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlcmFpc2VleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlc2V0ZXhjZXB0ZmxhZyAiY29uc3QgZmV4Y2VwdF90ICpmbGFncCIgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZldGVzdGV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlY2xlYXJleGNlcHQKK3JvdXRpbmUgY2xlYXJzIHRoZSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24gZmxhZ3Mgc3BlY2lmaWVkIGJ5CisuRmEgZXhjZXB0cyAsCit3aGVyZWFzCisuRm4gZmVyYWlzZWV4Y2VwdAorcmFpc2VzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucy4KK1JhaXNpbmcgYW4gZXhjZXB0aW9uIGNhdXNlcyB0aGUgY29ycmVzcG9uZGluZyBmbGFnIHRvIGJlIHNldCwKK2FuZCBhCisuRHYgU0lHRlBFCitpcyBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MgaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZC4KKy5QcAorVGhlCisuRm4gZmV0ZXN0ZXhjZXB0CitmdW5jdGlvbiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIGFyZSBjdXJyZW50bHkgc2V0LCBvZiB0aG9zZSBzcGVjaWZpZWQgYnkKKy5GYSBleGNlcHRzIC4KKy5QcAorVGhlCisuRm4gZmVnZXRleGNlcHRmbGFnCitmdW5jdGlvbiBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBleGNlcHRpb24gZmxhZ3Mgc3BlY2lmaWVkIGluCisuRmEgZXhjZXB0cworaW4gdGhlIG9wYXF1ZSBvYmplY3QgcG9pbnRlZCB0byBieQorLkZhIGZsYWdwIC4KK1NpbWlsYXJseSwKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK2NoYW5nZXMgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gZmxhZ3MgdG8gcmVmbGVjdCB0aGUgc3RhdGUgc3RvcmVkIGluCit0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkKKy5GYSBmbGFncCAuCitOb3RlIHRoYXQgdGhlIGZsYWdzIHJlc3RvcmVkIHdpdGgKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK211c3QgYmUgYSAobm90IG5lY2Vzc2FyaWx5IHByb3Blcikgc3Vic2V0IG9mIHRoZSBmbGFncyByZWNvcmRlZCBieQorYSBwcmlvciBjYWxsIHRvCisuRm4gZmVnZXRleGNlcHRmbGFnIC4KKy5QcAorRm9yIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBleGNlcHRpb25zCitpbmNsdWRlIHRob3NlIGRlc2NyaWJlZCBpbgorLlhyIGZlbnYgMyAuCitTb21lIGFyY2hpdGVjdHVyZXMgbWF5IGRlZmluZSBvdGhlciB0eXBlcyBvZiBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zLgorLlNoIElNUExFTUVOVEFUSU9OIE5PVEVTCitPbiBzb21lIGFyY2hpdGVjdHVyZXMsIHJhaXNpbmcgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93IGV4Y2VwdGlvbgorYWxzbyBjYXVzZXMgYW4gaW5leGFjdCBleGNlcHRpb24gdG8gYmUgcmFpc2VkLgorSW4gdGhlc2UgY2FzZXMsIHRoZSBvdmVyZmxvdyBvciB1bmRlcmZsb3cgd2lsbCBiZSByYWlzZWQgZmlyc3QuCisuUHAKK1RoZQorLkZuIGZlZ2V0ZXhjZXB0ZmxhZworYW5kCisuRm4gZmVzZXRleGNlcHRmbGFnCityb3V0aW5lcyBhcmUgcHJlZmVycmVkIHRvCisuRm4gZmV0ZXN0ZXhjZXB0CithbmQKKy5GbiBmZXJhaXNlZXhjZXB0ICwKK3Jlc3BlY3RpdmVseSwgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIGV4Y2VwdGlvbiBmbGFncy4KK1RoZSBsYXR0ZXIgZG8gbm90IHJlLXJhaXNlIGV4Y2VwdGlvbnMgYW5kIG1heSBwcmVzZXJ2ZQorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWRkcmVzc2VzIHdoZXJlCitleGNlcHRpb25zIG9jY3VycmVkLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGZlY2xlYXJleGNlcHQgLAorLkZuIGZlZ2V0ZXhjZXB0ZmxhZyAsCisuRm4gZmVyYWlzZWV4Y2VwdCAsCithbmQKKy5GbiBmZXNldGV4Y2VwdGZsYWcKK2Z1bmN0aW9ucyByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MsIGFuZCBub24temVybyBvdGhlcndpc2UuCitUaGUKKy5GbiBmZXRlc3RleGNlcHQKK2Z1bmN0aW9uIHJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBleGNlcHRpb24KK2ZsYWdzIHRoYXQgd2VyZSByZXF1ZXN0ZWQuCisuU2ggU0VFIEFMU08KKy5YciBzaWdhY3Rpb24gMiAsCisuWHIgZmVob2xkZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmV1cGRhdGVlbnYgMyAsCisuWHIgZnBnZXRzdGlja3kgMyAsCisuWHIgZnByZXNldHN0aWNreSAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmZWNsZWFyZXhjZXB0ICwKKy5GbiBmZWdldGV4Y2VwdGZsYWcgLAorLkZuIGZlcmFpc2VleGNlcHQgLAorLkZuIGZlc2V0ZXhjZXB0ZmxhZyAsCithbmQKKy5GbiBmZXRlc3RleGNlcHQKK3JvdXRpbmVzIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlc2UgZnVuY3Rpb25zIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlZW5hYmxlZXhjZXB0LjMgYi9saWJtL21hbi9mZWVuYWJsZWV4Y2VwdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzkwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9mZWVuYWJsZWV4Y2VwdC4zCkBAIC0wLDAgKzEsOTggQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mZWVuYWJsZWV4Y2VwdC4zLHYgMS4xIDIwMDUvMDMvMTYgMTk6MDQ6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBNYXJjaCAxNiwgMjAwNQorLkR0IEZFRU5BQkxFRVhDRVBUIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmZWVuYWJsZWV4Y2VwdCAsCisuTm0gZmVkaXNhYmxlZXhjZXB0ICwKKy5ObSBmZWdldGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBtYXNraW5nCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIGZlbnYuaAorLkZkICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCisuRnQgaW50CisuRm4gZmVlbmFibGVleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuRnQgaW50CisuRm4gZmVnZXRleGNlcHQgInZvaWQiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlZW5hYmxlZXhjZXB0CithbmQKKy5GbiBmZWRpc2FibGVleGNlcHQKK2Z1bmN0aW9ucwordW5tYXNrIGFuZCBtYXNrIChyZXNwZWN0aXZlbHkpIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGluCisuRmEgZXhjZXB0cyAuCitUaGUKKy5GbiBmZWdldGV4Y2VwdAorZnVuY3Rpb24KK3JldHVybnMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIG1hc2suCitBbGwgZXhjZXB0aW9ucyBhcmUgbWFza2VkIGJ5IGRlZmF1bHQuCisuUHAKK0Zsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgdGhhdCBwcm9kdWNlIHVubWFza2VkIGV4Y2VwdGlvbnMgd2lsbCB0cmFwLCBhbmQgYQorLkR2IFNJR0ZQRQord2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MuCitCeSBpbnN0YWxsaW5nIGEgc2lnbmFsIGhhbmRsZXIgZm9yCisuRHYgU0lHRlBFICwKK2FwcGxpY2F0aW9ucyBjYW4gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaW1tZWRpYXRlbHkgd2l0aG91dAordGVzdGluZyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFmdGVyIGV2ZXJ5IG9wZXJhdGlvbi4KK05vdGUgdGhhdCB0aGUgdHJhcCBtYXkgbm90IGJlIGltbWVkaWF0ZSwgYnV0IGl0IHNob3VsZCBvY2N1cgorYmVmb3JlIHRoZSBuZXh0IGZsb2F0aW5nLXBvaW50IGluc3RydWN0aW9uIGlzIGV4ZWN1dGVkLgorLlBwCitGb3IgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucywgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGV4Y2VwdGlvbnMKK2luY2x1ZGUgdGhvc2UgZGVzY3JpYmVkIGluCisuWHIgZmVudiAzIC4KK1NvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgZGVmaW5lIG90aGVyIHR5cGVzIG9mIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gZmVlbmFibGVleGNlcHQgLAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAsCithbmQKKy5GbiBmZWdldGV4Y2VwdAorZnVuY3Rpb25zIHJldHVybiBhIGJpdG1hcCBvZiB0aGUgZXhjZXB0aW9ucyB0aGF0IHdlcmUgdW5tYXNrZWQKK3ByaW9yIHRvIHRoZSBjYWxsLgorLlNoIFNFRSBBTFNPCisuWHIgc2lnYWN0aW9uIDIgLAorLlhyIGZlY2xlYXJleGNlcHQgMyAsCisuWHIgZmVob2xkZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmV1cGRhdGVlbnYgMworLlNoIEJVR1MKK0Z1bmN0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBtYXkgdHJpZ2dlciBleGNlcHRpb25zIG11bHRpcGxlCit0aW1lcyBhcyBhIHJlc3VsdCBvZiBpbnRlcm1lZGlhdGUgY29tcHV0YXRpb25zOworaG93ZXZlciwgdGhleSBnZW5lcmFsbHkgZG8gbm90IHRyaWdnZXIgc3B1cmlvdXMgZXhjZXB0aW9ucy4KKy5QcAorTm8gaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHRvIHBlcm1pdCBleGNlcHRpb25zIHRvIGJlIGhhbmRsZWQgaW4KK25vbnRyaXZpYWwgd2F5cy4KK1RoZXJlIGlzIG5vIHVuaWZvcm0gd2F5IGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB0byBhY2Nlc3MKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24tY2F1c2luZyBpbnN0cnVjdGlvbiwgb3IKK3RvIGRldGVybWluZSB3aGV0aGVyIHRoYXQgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIHJlZXhlY3V0ZWQKK2FmdGVyIHJldHVybmluZyBmcm9tIHRoZSBoYW5kbGVyLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZmVnZXRlbnYuMyBiL2xpYm0vbWFuL2ZlZ2V0ZW52LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzODZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZlZ2V0ZW52LjMKQEAgLTAsMCArMSwxMTMgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mZWdldGVudi4zLHYgMS4xIDIwMDQvMDYvMDYgMTA6MDY6MjYgZGFzIEV4cCAkCisuXCIKKy5EZCBNYXkgOCwgMjAwNAorLkR0IEZFR0VURU5WIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmZWdldGVudiAsCisuTm0gZmVob2xkZXhjZXB0ICwKKy5ObSBmZXNldGVudiAsCisuTm0gZmV1cGRhdGVlbnYKKy5OZCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBzYXZlIGFuZCByZXN0b3JlCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIGZlbnYuaAorLkZkICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCisuRnQgaW50CisuRm4gZmVnZXRlbnYgImZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZWhvbGRleGNlcHQgImZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZXNldGVudiAiY29uc3QgZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZldXBkYXRlZW52ICJjb25zdCBmZW52X3QgKmVudnAiCisuU2ggREVTQ1JJUFRJT04KK1RoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCBpbmNsdWRlcyBleGNlcHRpb24gZmxhZ3MgYW5kIG1hc2tzLCB0aGUKK2N1cnJlbnQgcm91bmRpbmcgbW9kZSwgYW5kIG90aGVyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzZXR0aW5ncy4KK0hvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGZpbGUuCisuUHAKK1RoZQorLkZuIGZlZ2V0ZW52CitmdW5jdGlvbiBzdG9yZXMgdGhlIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgaW4gdGhlIG9iamVjdAorcG9pbnRlZCB0byBieQorLkZhIGVudnAgLAord2hlcmVhcworLkZuIGZlaG9sZGV4Y2VwdAorc2F2ZXMgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQsIHRoZW4gY2xlYXJzIGFsbCBleGNlcHRpb24gZmxhZ3MKK2FuZCBtYXNrcyBhbGwgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucy4KKy5QcAorVGhlCisuRm4gZmVzZXRlbnYKK2Z1bmN0aW9uIHJlc3RvcmVzIGEgcHJldmlvdXNseSBzYXZlZCBlbnZpcm9ubWVudC4KK1RoZQorLkZuIGZldXBkYXRlZW52CitmdW5jdGlvbiByZXN0b3JlcyBhIHNhdmVkIGVudmlyb25tZW50IGFzIHdlbGwsIGJ1dCBpdCBhbHNvCityYWlzZXMgYW55IGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgaXQKK3JlcGxhY2VzLgorLlBwCitUaGUKKy5GbiBmZWhvbGRleGNlcHQKK2Z1bmN0aW9uIGlzIG9mdGVuIHVzZWQgd2l0aAorLkZuIGZldXBkYXRlZW52CitvcgorLkZuIGZlc2V0ZW52Cit0byBzdXBwcmVzcyBzcHVyaW91cyBleGNlcHRpb25zIHRoYXQgb2NjdXIgYXMgYSByZXN1bHQgb2YKK2ludGVybWVkaWF0ZSBjb21wdXRhdGlvbnMuCitBbiBleGFtcGxlIGluCisuWHIgZmVudiAzCitkZW1vbnN0cmF0ZXMgaG93IHRvIGRvIHRoaXMuCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gZmVnZXRlbnYgLAorLkZuIGZlaG9sZGV4Y2VwdCAsCisuRm4gZmVzZXRlbnYgLAorYW5kCisuRm4gZmV1cGRhdGVlbnYKK2Z1bmN0aW9ucyByZXR1cm4gMCBpZiB0aGV5IHN1Y2NlZWQsIGFuZCBub24temVybyBvdGhlcndpc2UuCisuU2ggU0VFIEFMU08KKy5YciBmZWNsZWFyZXhjZXB0IDMgLAorLlhyIGZlbnYgMyAsCisuWHIgZmVyYWlzZWV4Y2VwdCAzICwKKy5YciBmZXNldGVudiAzICwKKy5YciBmZXRlc3RleGNlcHQgMyAsCisuWHIgZnBnZXRtYXNrIDMgLAorLlhyIGZwZ2V0cHJlYyAzICwKKy5YciBmcHNldG1hc2sgMyAsCisuWHIgZnBzZXRwcmVjIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGZlZ2V0ZW52ICwKKy5GbiBmZWhvbGRleGNlcHQgLAorLkZuIGZlc2V0ZW52ICwKK2FuZAorLkZuIGZldXBkYXRlZW52CitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mZWdldHJvdW5kLjMgYi9saWJtL21hbi9mZWdldHJvdW5kLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4NDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2ZlZ2V0cm91bmQuMwpAQCAtMCwwICsxLDgzIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVnZXRyb3VuZC4zLHYgMS4yIDIwMDUvMDEvMTQgMDk6MTI6MDUgcnUgRXhwICQKKy5cIgorLkRkIE1heSA4LCAyMDA0CisuRHQgRkVHRVRST1VORCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVnZXRyb3VuZCAsCisuTm0gZmVzZXRyb3VuZAorLk5kIGZsb2F0aW5nLXBvaW50IHJvdW5kaW5nIGNvbnRyb2wKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gZmVudi5oCisuRmQgIiNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTiIKKy5GdCBpbnQKKy5GbiBmZWdldHJvdW5kIHZvaWQKKy5GdCBpbnQKKy5GbiBmZXNldHJvdW5kICJpbnQgcm91bmQiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGZlZ2V0cm91bmQKK2Z1bmN0aW9uIGRldGVybWluZXMgdGhlIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgcm91bmRpbmcgbW9kZSwKK2FuZCB0aGUKKy5GbiBmZXNldHJvdW5kCitmdW5jdGlvbiBzZXRzIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUgdG8KKy5GYSByb3VuZCAuCitUaGUgcm91bmRpbmcgbW9kZSBpcyBvbmUgb2YKKy5EdiBGRV9UT05FQVJFU1QgLCBGRV9ET1dOV0FSRCAsIEZFX1VQV0FSRCAsCitvcgorLkR2IEZFX1RPV0FSRFpFUk8gLAorYXMgZGVzY3JpYmVkIGluCisuWHIgZmVudiAzIC4KKy5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5GbiBmZWdldHJvdW5kCityb3V0aW5lIHJldHVybnMgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4KK1RoZQorLkZuIGZlc2V0cm91bmQKK2Z1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBvdGhlcndpc2U7Citob3dldmVyLCB0aGUgcHJlc2VudCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgc3VjY2VlZHMuCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIGZwZ2V0cm91bmQgMyAsCisuWHIgZnBzZXRyb3VuZCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmZWdldHJvdW5kCithbmQKKy5GbiBmZXNldHJvdW5kCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCitUaGV5IHN1cGVyc2VkZSB0aGUgbm9uLXN0YW5kYXJkCisuWHIgZnBnZXRyb3VuZCAzCithbmQKKy5YciBmcHNldHJvdW5kIDMKK2Z1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2ZlbnYuMyBiL2xpYm0vbWFuL2ZlbnYuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2FkNTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZmVudi4zCkBAIC0wLDAgKzEsMjg5IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vZmVudi4zLHYgMS41IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIE1hcmNoIDE2LCAyMDA1CisuRHQgRkVOViAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmVjbGVhcmV4Y2VwdCAsCisuTm0gZmVnZXRleGNlcHRmbGFnICwKKy5ObSBmZXJhaXNlZXhjZXB0ICwKKy5ObSBmZXNldGV4Y2VwdGZsYWcgLAorLk5tIGZldGVzdGV4Y2VwdCAsCisuTm0gZmVnZXRyb3VuZCAsCisuTm0gZmVzZXRyb3VuZCAsCisuTm0gZmVnZXRlbnYgLAorLk5tIGZlaG9sZGV4Y2VwdCAsCisuTm0gZmVzZXRlbnYgLAorLk5tIGZldXBkYXRlZW52ICwKKy5ObSBmZWVuYWJsZWV4Y2VwdCAsCisuTm0gZmVkaXNhYmxlZXhjZXB0ICwKKy5ObSBmZWdldGV4Y2VwdAorLk5kIGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IGNvbnRyb2wKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gZmVudi5oCisuRmQgIiNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTiIKKy5GdCBpbnQKKy5GbiBmZWNsZWFyZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZWdldGV4Y2VwdGZsYWcgImZleGNlcHRfdCAqZmxhZ3AiICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXJhaXNlZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXNldGV4Y2VwdGZsYWcgImNvbnN0IGZleGNlcHRfdCAqZmxhZ3AiICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZXRlc3RleGNlcHQgImludCBleGNlcHRzIgorLkZ0IGludAorLkZuIGZlZ2V0cm91bmQgdm9pZAorLkZ0IGludAorLkZuIGZlc2V0cm91bmQgImludCByb3VuZCIKKy5GdCBpbnQKKy5GbiBmZWdldGVudiAiZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZlaG9sZGV4Y2VwdCAiZmVudl90ICplbnZwIgorLkZ0IGludAorLkZuIGZlc2V0ZW52ICJjb25zdCBmZW52X3QgKmVudnAiCisuRnQgaW50CisuRm4gZmV1cGRhdGVlbnYgImNvbnN0IGZlbnZfdCAqZW52cCIKKy5GdCBpbnQKKy5GbiBmZWVuYWJsZWV4Y2VwdCAiaW50IGV4Y2VwdHMiCisuRnQgaW50CisuRm4gZmVkaXNhYmxlZXhjZXB0ICJpbnQgZXhjZXB0cyIKKy5GdCBpbnQKKy5GbiBmZWdldGV4Y2VwdCB2b2lkCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkluIGZlbnYuaAorcm91dGluZXMgbWFuaXB1bGF0ZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQsCit3aGljaCBpbmNsdWRlcyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFuZCByb3VuZGluZyBtb2RlcyBkZWZpbmVkIGluCisuU3QgLWllZWU3NTQgLgorLlNzIEV4Y2VwdGlvbnMKK0V4Y2VwdGlvbiBmbGFncyBhcmUgc2V0IGFzIHNpZGUtZWZmZWN0cyBvZiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljCitvcGVyYXRpb25zIGFuZCBtYXRoIGxpYnJhcnkgcm91dGluZXMsIGFuZCB0aGV5IHJlbWFpbiBzZXQgdW50aWwKK2V4cGxpY2l0bHkgY2xlYXJlZC4KK1RoZSBmb2xsb3dpbmcgbWFjcm9zIGV4cGFuZCB0byBiaXQgZmxhZ3Mgb2YgdHlwZQorLlZ0IGludAorcmVwcmVzZW50aW5nIHRoZSBmaXZlIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuQmwgLXRhZyAtd2lkdGggIi5EdiBGRV9ESVZCWVpFUk8iCisuSXQgRHYgRkVfRElWQllaRVJPCitBIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB0aGUgcHJvZ3JhbSBhdHRlbXB0cyB0bworZGl2aWRlIGEgZmluaXRlIG5vbi16ZXJvIG51bWJlciBieSB6ZXJvLgorLkl0IER2IEZFX0lORVhBQ1QKK0FuIGluZXhhY3QgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuZXZlciB0aGVyZSBpcyBhIGxvc3Mgb2YgcHJlY2lzaW9uCitkdWUgdG8gcm91bmRpbmcuCisuSXQgRHYgRkVfSU5WQUxJRAorSW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9ucyBvY2N1ciB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0bworcGVyZm9ybSBjYWxjdWxhdGlvbnMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIHJlYXNvbmFibGUgcmVwcmVzZW50YWJsZQorYW5zd2VyLgorRm9yIGluc3RhbmNlLCBzdWJ0cmFjdGlvbiBvZiBpbmZpbml0aWVzLCBkaXZpc2lvbiBvZiB6ZXJvIGJ5IHplcm8sCitvcmRlcmVkIGNvbXBhcmlzb24gaW52b2x2aW5nIFwqKE5hcywgYW5kIHRha2luZyB0aGUgc3F1YXJlIHJvb3Qgb2YgYQorbmVnYXRpdmUgbnVtYmVyIGFyZSBhbGwgaW52YWxpZCBvcGVyYXRpb25zLgorLkl0IER2IEZFX09WRVJGTE9XCitBbiBvdmVyZmxvdyBleGNlcHRpb24gb2NjdXJzIHdoZW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmVzdWx0IG9mIGEKK2NvbXB1dGF0aW9uIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGRlc3RpbmF0aW9uIHR5cGUuCisuSXQgRHYgRkVfVU5ERVJGTE9XCitVbmRlcmZsb3cgb2NjdXJzIHdoZW4gdGhlIHJlc3VsdCBvZiBhIGNvbXB1dGF0aW9uIGlzIHRvbyBjbG9zZSB0byB6ZXJvCit0byBiZSByZXByZXNlbnRlZCBhcyBhIG5vbi16ZXJvIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgorLkVsCisuUHAKK0FkZGl0aW9uYWxseSwgdGhlCisuRHYgRkVfQUxMX0VYQ0VQVAorbWFjcm8gZXhwYW5kcyB0byB0aGUgYml0d2lzZSBPUiBvZiB0aGUgYWJvdmUgZmxhZ3MgYW5kIGFueQorYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZsYWdzLgorQ29tYmluYXRpb25zIG9mIHRoZXNlIGZsYWdzIGFyZSBwYXNzZWQgdG8gdGhlCisuRm4gZmVjbGVhcmV4Y2VwdCAsCisuRm4gZmVnZXRleGNlcHRmbGFnICwKKy5GbiBmZXJhaXNlZXhjZXB0ICwKKy5GbiBmZXNldGV4Y2VwdGZsYWcgLAorYW5kCisuRm4gZmV0ZXN0ZXhjZXB0CitmdW5jdGlvbnMgdG8gY2xlYXIsIHNhdmUsIHJhaXNlLCByZXN0b3JlLCBhbmQgZXhhbWluZSB0aGUKK3Byb2Nlc3NvcidzIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFncywgcmVzcGVjdGl2ZWx5LgorLlBwCitFeGNlcHRpb25zIG1heSBiZQorLkVtIHVubWFza2VkCit3aXRoCisuRm4gZmVlbmFibGVleGNlcHQKK2FuZCBtYXNrZWQgd2l0aAorLkZuIGZlZGlzYWJsZWV4Y2VwdCAuCitVbm1hc2tlZCBleGNlcHRpb25zIGNhdXNlIGEgdHJhcCB3aGVuIHRoZXkgYXJlIHByb2R1Y2VkLCBhbmQKK2FsbCBleGNlcHRpb25zIGFyZSBtYXNrZWQgYnkgZGVmYXVsdC4KK1RoZSBjdXJyZW50IG1hc2sgY2FuIGJlIHRlc3RlZCB3aXRoCisuRm4gZmVnZXRleGNlcHQgLgorLlNzIFJvdW5kaW5nIE1vZGVzCisuU3QgLWllZWU3NTQKK3NwZWNpZmllcyBmb3VyIHJvdW5kaW5nIG1vZGVzLgorVGhlc2UgbW9kZXMgY29udHJvbCB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHJlc3VsdHMgYXJlIHJvdW5kZWQKK2Zyb20gdGhlaXIgZXhhY3QgdmFsdWVzIGluIG9yZGVyIHRvIGZpdCB0aGVtIGludG8gYmluYXJ5CitmbG9hdGluZy1wb2ludCB2YXJpYWJsZXMuCitUaGUgZm91ciBtb2RlcyBjb3JyZXNwb25kIHdpdGggdGhlIGZvbGxvd2luZyBzeW1ib2xpYyBjb25zdGFudHMuCisuQmwgLXRhZyAtd2lkdGggIi5EdiBGRV9UT1dBUkRaRVJPIgorLkl0IER2IEZFX1RPTkVBUkVTVAorUmVzdWx0cyBhcmUgcm91bmRlZCB0byB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorSWYgdGhlIGV4YWN0IHJlc3VsdCBpcyBleGFjdGx5IGhhbGYgd2F5IGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUKK3ZhbHVlcywgdGhlIHZhbHVlIHdob3NlIGxhc3QgYmluYXJ5IGRpZ2l0IGlzIGV2ZW4gKHplcm8pIGlzIGNob3Nlbi4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZS4KKy5JdCBEdiBGRV9ET1dOV0FSRAorUmVzdWx0cyBhcmUgcm91bmRlZCB0b3dhcmRzIG5lZ2F0aXZlIFwqW0lmXS4KKy5JdCBEdiBGRV9VUFdBUkQKK1Jlc3VsdHMgYXJlIHJvdW5kZWQgdG93YXJkcyBwb3NpdGl2ZSBcKltJZl0uCisuSXQgRHYgRkVfVE9XQVJEWkVSTworUmVzdWx0cyBhcmUgcm91bmRlZCB0b3dhcmRzIHplcm8uCisuRWwKKy5QcAorVGhlCisuRm4gZmVnZXRyb3VuZAorYW5kCisuRm4gZmVzZXRyb3VuZAorZnVuY3Rpb25zIHF1ZXJ5IGFuZCBzZXQgdGhlIHJvdW5kaW5nIG1vZGUuCisuU3MgRW52aXJvbm1lbnQgQ29udHJvbAorVGhlCisuRm4gZmVnZXRlbnYKK2FuZAorLkZuIGZlc2V0ZW52CitmdW5jdGlvbnMgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQsCit3aGljaCBpbmNsdWRlcyBleGNlcHRpb24gZmxhZ3MsIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBtYXNrLAordGhlIHJvdW5kaW5nIG1vZGUsIGFuZCBwb3NzaWJseSBvdGhlciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworc3RhdGUuCitUaGUKKy5GbiBmZWhvbGRleGNlcHQKK2Z1bmN0aW9uIGJlaGF2ZXMgbGlrZQorLkZuIGZlZ2V0ZW52ICwKK2J1dCB3aXRoIHRoZSBhZGRpdGlvbmFsIGVmZmVjdCBvZiBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZsYWdzIGFuZAoraW5zdGFsbGluZyBhCisuRW0gbm9uLXN0b3AKK21vZGUuCitJbiBub24tc3RvcCBtb2RlLCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIHdpbGwgc2V0IGV4Y2VwdGlvbiBmbGFncworYXMgdXN1YWwsIGJ1dCBubworLkR2IFNJR0ZQRQorc2lnbmFscyB3aWxsIGJlIGdlbmVyYXRlZCBhcyBhIHJlc3VsdC4KK05vbi1zdG9wIG1vZGUgaXMgdGhlIGRlZmF1bHQsIGJ1dCBpdCBtYXkgYmUgYWx0ZXJlZCBieQorbm9uLXN0YW5kYXJkIG1lY2hhbmlzbXMuCisuXCIgWFhYIE1lbnRpb24gZmVbZ3NdZXRtYXNrKCkgaGVyZSBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIGZpbmFsaXplZAorLlwiIFhYWCBhbmQgcmVhZHkgdG8gYmUgb2ZmaWNpYWxseSBkb2N1bWVudGVkLgorVGhlCisuRm4gZmV1cGRhdGVlbnYKK2Z1bmN0aW9uIHJlc3RvcmVzIGEgc2F2ZWQgZW52aXJvbm1lbnQgc2ltaWxhcmx5IHRvCisuRm4gZmVzZXRlbnYgLAorYnV0IGl0IGFsc28gcmUtcmFpc2VzIGFueSBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zIGZyb20gdGhlIG9sZAorZW52aXJvbm1lbnQuCisuUHAKK1RoZSBtYWNybworLkR2IEZFX0RGTF9FTlYKK2V4cGFuZHMgdG8gYSBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LgorLlNoIENBVkVBVFMKK1RoZSBGRU5WX0FDQ0VTUyBwcmFnbWEgY2FuIGJlIGVuYWJsZWQgd2l0aAorLkRsICIjcHJhZ21hIFNUREMgRkVOVl9BQ0NFU1MgT04iCithbmQgZGlzYWJsZWQgd2l0aCB0aGUKKy5EbCAiI3ByYWdtYSBTVERDIEZFTlZfQUNDRVNTIE9GRiIKK2RpcmVjdGl2ZS4KK1RoaXMgbGV4aWNhbGx5LXNjb3BlZCBhbm5vdGF0aW9uIHRlbGxzIHRoZSBjb21waWxlciB0aGF0IHRoZSBwcm9ncmFtCittYXkgYWNjZXNzIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCwgc28gb3B0aW1pemF0aW9ucyB0aGF0IHdvdWxkCit2aW9sYXRlIHN0cmljdCBJRUVFLTc1NCBzZW1hbnRpY3MgYXJlIGRpc2FibGVkLgorSWYgZXhlY3V0aW9uIHJlYWNoZXMgYSBibG9jayBvZiBjb2RlIGZvciB3aGljaAorLkR2IEZFTlZfQUNDRVNTCitpcyBvZmYsIHRoZSBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCB3aWxsIGJlY29tZSB1bmRlZmluZWQuCisuU2ggRVhBTVBMRVMKK1RoZSBmb2xsb3dpbmcgcm91dGluZSBjb21wdXRlcyB0aGUgc3F1YXJlIHJvb3QgZnVuY3Rpb24uCitJdCBleHBsaWNpdGx5IHJhaXNlcyBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBvbiBhcHByb3ByaWF0ZSBpbnB1dHMgdXNpbmcKKy5GbiBmZXJhaXNlZXhjZXB0IC4KK0l0IGFsc28gZGVmZXJzIGluZXhhY3QgZXhjZXB0aW9ucyB3aGlsZSBpdCBjb21wdXRlcyBpbnRlcm1lZGlhdGUKK3ZhbHVlcywgYW5kIHRoZW4gaXQgYWxsb3dzIGFuIGluZXhhY3QgZXhjZXB0aW9uIHRvIGJlIHJhaXNlZCBvbmx5IGlmCit0aGUgZmluYWwgYW5zd2VyIGlzIGluZXhhY3QuCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKKyNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyBPTgorZG91YmxlIHNxcnQoZG91YmxlIG4pIHsKKwlkb3VibGUgeCA9IDEuMDsKKwlmZW52X3QgZW52OworCisJaWYgKGlzbmFuKG4pIHx8IG4gPCAwLjApIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKwkJcmV0dXJuIChOQU4pOworCX0KKwlpZiAoaXNpbmYobikgfHwgbiA9PSAwLjApCisJCXJldHVybiAobik7CisJZmVob2xkZXhjZXB0KCZlbnYpOworCXdoaWxlIChmYWJzKCh4ICogeCkgLSBuKSA+IERCTF9FUFNJTE9OICogMiAqIHgpCisJCXggPSAoeCAvIDIpICsgKG4gLyAoMiAqIHgpKTsKKwlpZiAoeCAqIHggPT0gbikKKwkJZmVjbGVhcmV4Y2VwdChGRV9JTkVYQUNUKTsKKwlmZXVwZGF0ZWVudigmZW52KTsKKwlyZXR1cm4gKHgpOworfQorLkVkCisuU2ggU0VFIEFMU08KKy5YciBjYyAxICwKKy5YciBmZWNsZWFyZXhjZXB0IDMgLAorLlhyIGZlZGlzYWJsZWV4Y2VwdCAzICwKKy5YciBmZWVuYWJsZWV4Y2VwdCAzICwKKy5YciBmZWdldGVudiAzICwKKy5YciBmZWdldGV4Y2VwdCAzICwKKy5YciBmZWdldGV4Y2VwdGZsYWcgMyAsCisuWHIgZmVnZXRyb3VuZCAzICwKKy5YciBmZWhvbGRleGNlcHQgMyAsCisuWHIgZmVyYWlzZWV4Y2VwdCAzICwKKy5YciBmZXNldGVudiAzICwKKy5YciBmZXNldGV4Y2VwdGZsYWcgMyAsCisuWHIgZmVzZXRyb3VuZCAzICwKKy5YciBmZXRlc3RleGNlcHQgMyAsCisuWHIgZmV1cGRhdGVlbnYgMyAsCisuWHIgZnBnZXRwcmVjIDMgLAorLlhyIGZwc2V0cHJlYyAzCisuU2ggU1RBTkRBUkRTCitFeGNlcHQgYXMgbm90ZWQgYmVsb3csCisuSW4gZmVudi5oCitjb25mb3JtcyB0bworLlN0IC1pc29DLTk5IC4KK1RoZQorLkZuIGZlZW5hYmxlZXhjZXB0ICwKKy5GbiBmZWRpc2FibGVleGNlcHQgLAorYW5kCisuRm4gZmVnZXRleGNlcHQKK3JvdXRpbmVzIGFyZSBleHRlbnNpb25zLgorLlNoIEhJU1RPUlkKK1RoZQorLkluIGZlbnYuaAoraGVhZGVyIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KK0l0IHN1cGVyc2VkZXMgdGhlIG5vbi1zdGFuZGFyZCByb3V0aW5lcyBkZWZpbmVkIGluCisuSW4gaWVlZWZwLmgKK2FuZCBkb2N1bWVudGVkIGluCisuWHIgZnBnZXRyb3VuZCAzIC4KKy5TaCBCVUdTCitUaGUKKy5EdiBGRU5WX0FDQ0VTUworcHJhZ21hIGlzIHVuaW1wbGVtZW50ZWQgaW4gdGhlIHN5c3RlbSBjb21waWxlci4KK0hvd2V2ZXIsIG5vbi1jb25zdGFudCBleHByZXNzaW9ucyBnZW5lcmFsbHkgcHJvZHVjZSB0aGUgY29ycmVjdAorc2lkZS1lZmZlY3RzIGF0IGxvdyBvcHRpbWl6YXRpb24gbGV2ZWxzLgorLlBwCitPbiB0aGUgQWxwaGEgcGxhdGZvcm0sCisuWHIgY2MgMQorbXVzdCBiZSBwYXNzZWQgdGhlCisuRmwgbWllZWUtd2l0aC1pbmV4YWN0IG1mcC1yb3VuZGluZy1tb2RlPWQKK29wdGlvbnMgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IGhhcyB0aGUgc3RhbmRhcmQKK3NpZGUtZWZmZWN0cyBhbmQgdXNlcyB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGVzLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZmxvb3IuMyBiL2xpYm0vbWFuL2Zsb29yLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMmRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Zsb29yLjMKQEAgLTAsMCArMSw4MiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWZsb29yLjMJNi41IChCZXJrZWxleSkgNC8xOS85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2Zsb29yLjMsdiAxLjE3IDIwMDUvMDEvMTMgMDk6MzU6NDcgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMTMsIDIwMDUKKy5EdCBGTE9PUiAzCisuT3MKKy5TaCBOQU1FCisuTm0gZmxvb3IgLAorLk5tIGZsb29yZiAsCisuTm0gZmxvb3JsCisuTmQgbGFyZ2VzdCBpbnRlZ3JhbCB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbG9vciAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBmbG9vcmYgImZsb2F0IHgiCisuRnQgImxvbmcgZG91YmxlIgorLkZuIGZsb29ybCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZmxvb3IgLAorLkZuIGZsb29yZgorYW5kCisuRm4gZmxvb3JsCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBsYXJnZXN0IGludGVncmFsIHZhbHVlCitsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKy5GYSB4ICwKK2V4cHJlc3NlZCBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKy5TaCBTRUUgQUxTTworLlhyIGFicyAzICwKKy5YciBjZWlsIDMgLAorLlhyIGZhYnMgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMyAsCisuWHIgdHJ1bmMgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZmxvb3IKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgorVGhlCisuRm4gZmxvb3JmCithbmQKKy5GbiBmbG9vcmwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZm1hLjMgYi9saWJtL21hbi9mbWEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhhNmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vZm1hLjMKQEAgLTAsMCArMSwxMTYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9mbWEuMyx2IDEuMyAyMDA1LzExLzI0IDA5OjI1OjEwIGpvZWwgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMjIsIDIwMDUKKy5EdCBGTUEgMworLk9zCisuU2ggTkFNRQorLk5tIGZtYSAsCisuTm0gZm1hZiAsCisuTm0gZm1hbAorLk5kIGZ1c2VkIG11bHRpcGx5LWFkZAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbWEgImRvdWJsZSB4IiAiZG91YmxlIHkiICJkb3VibGUgeiIKKy5GdCBmbG9hdAorLkZuIGZtYWYgImZsb2F0IHgiICJmbG9hdCB5IiAiZmxvYXQgeiIKKy5GdCBsb25nIGRvdWJsZQorLkZuIGZtYWwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IiAibG9uZyBkb3VibGUgeiIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZm1hICwKKy5GbiBmbWFmICwKK2FuZAorLkZuIGZtYWwKK2Z1bmN0aW9ucyByZXR1cm4KKy5ObyAiKHggKiB5KSArIHoiICwKK2NvbXB1dGVkIHdpdGggb25seSBvbmUgcm91bmRpbmcgZXJyb3IuCitVc2luZyB0aGUgb3JkaW5hcnkgbXVsdGlwbGljYXRpb24gYW5kIGFkZGl0aW9uIG9wZXJhdG9ycywgYnkgY29udHJhc3QsCityZXN1bHRzIGluIHR3byByb3VuZGluZ3M6IG9uZSBmb3IgdGhlIGludGVybWVkaWF0ZSBwcm9kdWN0IGFuZCBvbmUgZm9yCit0aGUgZmluYWwgcmVzdWx0LgorLlBwCitGb3IgaW5zdGFuY2UsIHRoZSBleHByZXNzaW9uCisuTm8gIjEuMmUxMDAgKiAyLjBlMjA4IC0gMS40ZTMwOCIKK3Byb2R1Y2VzIFwqKElmIGR1ZSB0byBvdmVyZmxvdyBpbiB0aGUgaW50ZXJtZWRpYXRlIHByb2R1Y3QsIHdoZXJlYXMKKy5ObyAiZm1hKDEuMmUxMDAsIDIuMGUyMDgsIC0xLjRlMzA4KSIKK3JldHVybnMgYXBwcm94aW1hdGVseSAxLjBlMzA4LgorLlBwCitUaGUgZnVzZWQgbXVsdGlwbHktYWRkIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VkIHRvIGltcHJvdmUgdGhlCithY2N1cmFjeSBvZiBjYWxjdWxhdGlvbnMgc3VjaCBhcyBkb3QgcHJvZHVjdHMuCitJdCBtYXkgYWxzbyBiZSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gbWFjaGluZXMgdGhhdCBpbXBsZW1lbnQKK2l0IG5hdGl2ZWx5LgorVGhlIG1hY3JvcworLkR2IEZQX0ZBU1RfRk1BICwKKy5EdiBGUF9GQVNUX0ZNQUYKK2FuZAorLkR2IEZQX0ZBU1RfRk1BTAorbWF5IGJlIGRlZmluZWQgaW4KKy5JbiBtYXRoLmgKK3RvIGluZGljYXRlIHRoYXQKKy5GbiBmbWEgLAorLkZuIGZtYWYgLAorYW5kCisuRm4gZm1hbAorKHJlc3BlY3RpdmVseSkgaGF2ZSBjb21wYXJhYmxlIG9yIGZhc3RlciBzcGVlZCB0aGFuIGEgbXVsdGlwbHkKK29wZXJhdGlvbiBmb2xsb3dlZCBieSBhbiBhZGQgb3BlcmF0aW9uLgorLlNoIElNUExFTUVOVEFUSU9OIE5PVEVTCitJbiBnZW5lcmFsLCB0aGVzZSByb3V0aW5lcyB3aWxsIGJlaGF2ZSBhcyBvbmUgd291bGQgZXhwZWN0IGlmCisuTm8gInggKiB5ICsgeiIKK3dlcmUgY29tcHV0ZWQgd2l0aCB1bmJvdW5kZWQgcHJlY2lzaW9uIGFuZCByYW5nZSwKK3RoZW4gcm91bmRlZCB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSByZXR1cm4gdHlwZS4KK0hvd2V2ZXIsIG9uIHNvbWUgcGxhdGZvcm1zLCBpZgorLkZhIHoKK2lzIFwqKE5hLCB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCByYWlzZSBhbiBleGNlcHRpb24gZXZlbgord2hlbiB0aGUgY29tcHV0YXRpb24gb2YKKy5ObyAieCAqIHkiCit3b3VsZCBoYXZlIG90aGVyd2lzZSBnZW5lcmF0ZWQgYW4gaW52YWxpZCBleGNlcHRpb24uCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gZm1hICwKKy5GbiBmbWFmICwKK2FuZAorLkZuIGZtYWwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorQSBmdXNlZCBtdWx0aXBseS1hZGQgb3BlcmF0aW9uIHdpdGggdmlydHVhbGx5IGlkZW50aWNhbAorY2hhcmFjdGVyaXN0aWNzIGFwcGVhcnMgaW4gSUVFRSBkcmFmdCBzdGFuZGFyZCA3NTRSLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIGZtYQorYW5kCisuRm4gZm1hZgorcm91dGluZXMgZmlyc3QgYXBwZWFyZWQgaW4KKy5GeCA1LjQgLAorYW5kCisuRm4gZm1hbAorYXBwZWFyZWQgaW4KKy5GeCA2LjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vZm1heC4zIGIvbGlibS9tYW4vZm1heC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjQ5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9mbWF4LjMKQEAgLTAsMCArMSw5NyBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2ZtYXguMyx2IDEuMiAyMDA1LzAxLzE0IDA5OjEyOjA1IHJ1IEV4cCAkCisuXCIKKy5EZCBKdW5lIDI5LCAyMDA0CisuRHQgRk1BWCAzCisuT3MKKy5TaCBOQU1FCisuTm0gZm1heCAsCisuTm0gZm1heGYgLAorLk5tIGZtYXhsICwKKy5ObSBmbWluICwKKy5ObSBmbWluZiAsCisuTm0gZm1pbmwKKy5OZCBmbG9hdGluZy1wb2ludCBtYXhpbXVtIGFuZCBtaW5pbXVtIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBmbWF4ICJkb3VibGUgeCIgImRvdWJsZSB5IgorLkZ0IGZsb2F0CisuRm4gZm1heGYgImZsb2F0IHgiICJmbG9hdCB5IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiBmbWF4bCAibG9uZyBkb3VibGUgeCIgImxvbmcgZG91YmxlIHkiCisuRnQgZG91YmxlCisuRm4gZm1pbiAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZtaW5mICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gZm1pbmwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBmbWF4ICwKKy5GbiBmbWF4ZiAsCithbmQKKy5GbiBmbWF4bAorZnVuY3Rpb25zIHJldHVybiB0aGUgbGFyZ2VyIG9mCisuRmEgeAorYW5kCisuRmEgeSAsCithbmQgbGlrZXdpc2UsIHRoZQorLkZuIGZtaW4gLAorLkZuIGZtaW5mICwKK2FuZAorLkZuIGZtaW5sCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBzbWFsbGVyIG9mCisuRmEgeAorYW5kCisuRmEgeSAuCitUaGV5IHRyZWF0CisuTGkgKzAuMAorYXMgYmVpbmcgbGFyZ2VyIHRoYW4KKy5MaSAtMC4wIC4KK0lmIG9uZSBhcmd1bWVudCBpcyBhbiBcKihOYSwgdGhlbiB0aGUgb3RoZXIgYXJndW1lbnQgaXMgcmV0dXJuZWQuCitJZiBib3RoIGFyZ3VtZW50cyBhcmUgXCooTmFzLCB0aGVuIHRoZSByZXN1bHQgaXMgYW4gXCooTmEuCitUaGVzZSByb3V0aW5lcyBkbyBub3QgcmFpc2UgYW55IGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMuCisuU2ggU0VFIEFMU08KKy5YciBmYWJzIDMgLAorLlhyIGZkaW0gMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmbWF4ICwKKy5GbiBmbWF4ZiAsCisuRm4gZm1heGwgLAorLkZuIGZtaW4gLAorLkZuIGZtaW5mICwKK2FuZAorLkZuIGZtaW5sCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9mbW9kLjMgYi9saWJtL21hbi9mbW9kLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNGVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2Ztb2QuMwpAQCAtMCwwICsxLDg3IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpZm1vZC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2Ztb2QuMyx2IDEuOCAyMDAxLzEwLzEzIDEyOjIzOjIzIGJkZSBFeHAgJAorLlwiCisuRGQgTWF5IDIsIDE5OTEKKy5EdCBGTU9EIDMKKy5PcworLlNoIE5BTUUKKy5ObSBmbW9kICwKKy5ObSBmbW9kZgorLk5kIGZsb2F0aW5nLXBvaW50IHJlbWFpbmRlciBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gZm1vZCAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGZtb2RmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gZm1vZAorYW5kIHRoZQorLkZuIGZtb2RmCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgZmxvYXRpbmctcG9pbnQgcmVtYWluZGVyIG9mCisuRmEgeCBOcyAvIEZhIHkgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIGZtb2QKK2FuZCB0aGUKKy5GbiBmbW9kZgorZnVuY3Rpb25zIHJldHVybiB0aGUgdmFsdWUKKy5TbSBvZmYKKy5GYSB4IC0gRW0gaSAqIEZhIHkgLAorLlNtIG9uCitmb3Igc29tZSBpbnRlZ2VyCisuRW0gaQorc3VjaCB0aGF0LCBpZgorLkZhIHkKK2lzIG5vbi16ZXJvLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaWduIGFzCisuRmEgeAorYW5kIG1hZ25pdHVkZSBsZXNzIHRoYW4gdGhlIG1hZ25pdHVkZSBvZgorLkZhIHkgLgorSWYKKy5GYSB5CitpcyB6ZXJvLCB3aGV0aGVyIGEgZG9tYWluIGVycm9yIG9jY3VycyBvciB0aGUKKy5GbiBmbW9kCithbmQgdGhlCisuRm4gZm1vZGYKK2Z1bmN0aW9uIHJldHVybnMgemVybyBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorLlNoIFNFRSBBTFNPCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBmbW9kCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL2h5cG90LjMgYi9saWJtL21hbi9oeXBvdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmEyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9oeXBvdC4zCkBAIC0wLDAgKzEsMTM0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIyloeXBvdC4zCTYuNyAoQmVya2VsZXkpIDUvNi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2h5cG90LjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgSFlQT1QgMworLk9zCisuU2ggTkFNRQorLk5tIGh5cG90ICwKKy5ObSBoeXBvdGYgLAorLk5tIGNhYnMgLAorLk5tIGNhYnNmCisuTmQgRXVjbGlkZWFuIGRpc3RhbmNlIGFuZCBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBoeXBvdCAiZG91YmxlIHgiICJkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIGh5cG90ZiAiZmxvYXQgeCIgImZsb2F0IHkiCisuSW4gY29tcGxleC5oCisuRnQgZG91YmxlCisuRm4gY2FicyAiZG91YmxlIGNvbXBsZXggeiIKKy5GdCBmbG9hdAorLkZuIGNhYnNmICJmbG9hdCBjb21wbGV4IHoiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGh5cG90CithbmQKKy5GbiBoeXBvdGYKK2Z1bmN0aW9ucworY29tcHV0ZSB0aGUKK3NxcnQoeCp4K3kqeSkKK2luIHN1Y2ggYSB3YXkgdGhhdCB1bmRlcmZsb3cgd2lsbCBub3QgaGFwcGVuLCBhbmQgb3ZlcmZsb3cKK29jY3VycyBvbmx5IGlmIHRoZSBmaW5hbCByZXN1bHQgZGVzZXJ2ZXMgaXQuCitUaGUKKy5GbiBjYWJzCithbmQKKy5GbiBjYWJzZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgb2YKKy5GYSB6IC4KKy5QcAorLkZuIGh5cG90ICJcKihJZiIgInYiCis9CisuRm4gaHlwb3QgInYiICJcKihJZiIKKz0gK1wqKElmIGZvciBhbGwKKy5GYSB2ICwKK2luY2x1ZGluZyBcKihOYS4KKy5TaCBFUlJPUiAoZHVlIHRvIFJvdW5kb2ZmLCBldGMuKQorQmVsb3cgMC45NworLkVtIHVscHMgLgorQ29uc2VxdWVudGx5CisuRm4gaHlwb3QgIjUuMCIgIjEyLjAiCis9IDEzLjAKK2V4YWN0bHk7CitpbiBnZW5lcmFsLCBoeXBvdCBhbmQgY2FicyByZXR1cm4gYW4gaW50ZWdlciB3aGVuZXZlciBhbgoraW50ZWdlciBtaWdodCBiZSBleHBlY3RlZC4KKy5QcAorVGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgZm9yIHRoZSBzaG9ydGVyIGFuZCBmYXN0ZXIgdmVyc2lvbiBvZiBoeXBvdAorYW5kIGNhYnMgdGhhdCBpcyBwcm92aWRlZCBpbiB0aGUgY29tbWVudHMgaW4gY2Ficy5jOyBpdHMgZXJyb3IgY2FuCitleGNlZWQgMS4yCisuRW0gdWxwcyAuCisuU2ggTk9URVMKK0FzIG1pZ2h0IGJlIGV4cGVjdGVkLAorLkZuIGh5cG90ICJ2IiAiXCooTmEiCithbmQKKy5GbiBoeXBvdCAiXCooTmEiICJ2IgorYXJlIFwqKE5hIGZvciBhbGwKKy5FbSBmaW5pdGUKKy5GYSB2IC4KK0J1dCBwcm9ncmFtbWVycworbWlnaHQgYmUgc3VycHJpc2VkIGF0IGZpcnN0IHRvIGRpc2NvdmVyIHRoYXQKKy5GbiBoeXBvdCAiXCgrLVwqKElmIiAiXCooTmEiCis9ICtcKihJZi4KK1RoaXMgaXMgaW50ZW50aW9uYWw7IGl0IGhhcHBlbnMgYmVjYXVzZQorLkZuIGh5cG90ICJcKihJZiIgInYiCis9ICtcKihJZgorZm9yCisuRW0gYWxsCisuRmEgdiAsCitmaW5pdGUgb3IgaW5maW5pdGUuCitIZW5jZQorLkZuIGh5cG90ICJcKihJZiIgInYiCitpcyBpbmRlcGVuZGVudCBvZgorLkZhIHYgLgorVW5saWtlIHRoZSByZXNlcnZlZCBvcGVyYW5kIGZhdWx0IG9uIGEKKy5UbiBWQVggLAordGhlCisuVG4gSUVFRQorXCooTmEgaXMgZGVzaWduZWQgdG8KK2Rpc2FwcGVhciB3aGVuIGl0IHR1cm5zIG91dCB0byBiZSBpcnJlbGV2YW50LCBhcyBpdCBkb2VzIGluCisuRm4gaHlwb3QgIlwqKElmIiAiXCooTmEiIC4KKy5TaCBTRUUgQUxTTworLlhyIG1hdGggMyAsCisuWHIgc3FydCAzCisuU2ggSElTVE9SWQorQm90aCBhCisuRm4gaHlwb3QKK2Z1bmN0aW9uIGFuZCBhCisuRm4gY2FicworZnVuY3Rpb24KK2FwcGVhcmVkIGluCisuQXQgdjcgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vaWVlZS4zIGIvbGlibS9tYW4vaWVlZS4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzA4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9pZWVlLjMKQEAgLTAsMCArMSw0NDggQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9pZWVlLjMsdiAxLjIyIDIwMDUvMDYvMTYgMjE6NTU6NDUgcnUgRXhwICQKKy5cIgorLkRkIEphbnVhcnkgMjYsIDIwMDUKKy5EdCBJRUVFIDMKKy5PcworLlNoIE5BTUUKKy5ObSBpZWVlCisuTmQgSUVFRSBzdGFuZGFyZCA3NTQgZm9yIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMKKy5TaCBERVNDUklQVElPTgorVGhlIElFRUUgU3RhbmRhcmQgNzU0IGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYworZGVmaW5lcyByZXByZXNlbnRhdGlvbnMgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhbmQgYWJzdHJhY3QKK3Byb3BlcnRpZXMgb2YgYXJpdGhtZXRpYyBvcGVyYXRpb25zIHJlbGF0aW5nIHRvIHByZWNpc2lvbiwKK3JvdW5kaW5nLCBhbmQgZXhjZXB0aW9uYWwgY2FzZXMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KKy5TcyBJRUVFIFNUQU5EQVJEIDc1NCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCitSYWRpeDogQmluYXJ5LgorLlBwCitPdmVyZmxvdyBhbmQgdW5kZXJmbG93OgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK092ZXJmbG93IGdvZXMgYnkgZGVmYXVsdCB0byBhIHNpZ25lZCBcKihJZi4KK1VuZGVyZmxvdyBpcworLkVtIGdyYWR1YWwgLgorLkVkCisuUHAKK1plcm8gaXMgcmVwcmVzZW50ZWQgYW1iaWd1b3VzbHkgYXMgKzAgb3IgXC0wLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0l0cyBzaWduIHRyYW5zZm9ybXMgY29ycmVjdGx5IHRocm91Z2ggbXVsdGlwbGljYXRpb24gb3IKK2RpdmlzaW9uLCBhbmQgaXMgcHJlc2VydmVkIGJ5IGFkZGl0aW9uIG9mIHplcm9zCit3aXRoIGxpa2Ugc2lnbnM7IGJ1dCB4XC14IHlpZWxkcyArMCBmb3IgZXZlcnkKK2Zpbml0ZSB4LgorVGhlIG9ubHkgb3BlcmF0aW9ucyB0aGF0IHJldmVhbCB6ZXJvJ3MKK3NpZ24gYXJlIGRpdmlzaW9uIGJ5IHplcm8gYW5kCisuRm4gY29weXNpZ24geCBcKCstMCAuCitJbiBwYXJ0aWN1bGFyLCBjb21wYXJpc29uICh4ID4geSwgeCBcKD49IHksIGV0Yy4pXCYKK2Nhbm5vdCBiZSBhZmZlY3RlZCBieSB0aGUgc2lnbiBvZiB6ZXJvOyBidXQgaWYKK2Zpbml0ZSB4ID0geSB0aGVuIFwqKElmID0gMS8oeFwteSkgXCghPSBcLTEvKHlcLXgpID0gXC1cKihJZi4KKy5FZAorLlBwCitJbmZpbml0eSBpcyBzaWduZWQuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSXQgcGVyc2lzdHMgd2hlbiBhZGRlZCB0byBpdHNlbGYKK29yIHRvIGFueSBmaW5pdGUgbnVtYmVyLgorSXRzIHNpZ24gdHJhbnNmb3JtcworY29ycmVjdGx5IHRocm91Z2ggbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uLCBhbmQKKyhmaW5pdGUpL1woKy1cKihJZlwwPVwwXCgrLTAKKyhub256ZXJvKS8wID0gXCgrLVwqKElmLgorQnV0CitcKihJZlwtXCooSWYsIFwqKElmXCgqKjAgYW5kIFwqKElmL1wqKElmCithcmUsIGxpa2UgMC8wIGFuZCBzcXJ0KFwtMyksCitpbnZhbGlkIG9wZXJhdGlvbnMgdGhhdCBwcm9kdWNlIFwqKE5hLiAuLi4KKy5FZAorLlBwCitSZXNlcnZlZCBvcGVyYW5kcyAoXCooTmFzKToKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitBbiBcKihOYSBpcworLkVtICggTiBOcyBvdCBFbSBhIE4gTnMgdW1iZXIgKSAuCitTb21lIFwqKE5hcywgY2FsbGVkIFNpZ25hbGluZyBcKihOYXMsIHRyYXAgYW55IGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgorcGVyZm9ybWVkIHVwb24gdGhlbTsgdGhleSBhcmUgdXNlZCB0byBtYXJrIG1pc3NpbmcKK29yIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBvciBub25leGlzdGVudCBlbGVtZW50cworb2YgYXJyYXlzLgorVGhlIHJlc3QgYXJlIFF1aWV0IFwqKE5hczsgdGhleSBhcmUKK3RoZSBkZWZhdWx0IHJlc3VsdHMgb2YgSW52YWxpZCBPcGVyYXRpb25zLCBhbmQKK3Byb3BhZ2F0ZSB0aHJvdWdoIHN1YnNlcXVlbnQgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorSWYgeCBcKCE9IHggdGhlbiB4IGlzIFwqKE5hOyBldmVyeSBvdGhlciBwcmVkaWNhdGUKKyh4ID4geSwgeCA9IHksIHggPCB5LCAuLi4pIGlzIEZBTFNFIGlmIFwqKE5hIGlzIGludm9sdmVkLgorLkVkCisuUHAKK1JvdW5kaW5nOgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0V2ZXJ5IGFsZ2VicmFpYyBvcGVyYXRpb24gKCssIFwtLCBcKCoqLCAvLAorXChzcikKK2lzIHJvdW5kZWQgYnkgZGVmYXVsdCB0byB3aXRoaW4gaGFsZiBhbgorLkVtIHVscCAsCithbmQgd2hlbiB0aGUgcm91bmRpbmcgZXJyb3IgaXMgZXhhY3RseSBoYWxmIGFuCisuRW0gdWxwCit0aGVuCit0aGUgcm91bmRlZCB2YWx1ZSdzIGxlYXN0IHNpZ25pZmljYW50IGJpdCBpcyB6ZXJvLgorKEFuCisuRW0gdWxwCitpcyBvbmUKKy5FbSBVIE5zIG5pdAoraW4gdGhlCisuRW0gTCBOcyBhc3QKKy5FbSBQIE5zIGxhY2UgLiApCitUaGlzIGtpbmQgb2Ygcm91bmRpbmcgaXMgdXN1YWxseSB0aGUgYmVzdCBraW5kLAorc29tZXRpbWVzIHByb3ZhYmx5IHNvOyBmb3IgaW5zdGFuY2UsIGZvciBldmVyeQoreCA9IDEuMCwgMi4wLCAzLjAsIDQuMCwgLi4uLCAyLjAqKjUyLCB3ZSBmaW5kCisoeC8zLjApXCgqKjMuMCA9PSB4IGFuZCAoeC8xMC4wKVwoKioxMC4wID09IHggYW5kIC4uLgorZGVzcGl0ZSB0aGF0IGJvdGggdGhlIHF1b3RpZW50cyBhbmQgdGhlIHByb2R1Y3RzCitoYXZlIGJlZW4gcm91bmRlZC4KK09ubHkgcm91bmRpbmcgbGlrZSBJRUVFIDc1NCBjYW4gZG8gdGhhdC4KK0J1dCBubyBzaW5nbGUga2luZCBvZiByb3VuZGluZyBjYW4gYmUKK3Byb3ZlZCBiZXN0IGZvciBldmVyeSBjaXJjdW1zdGFuY2UsIHNvIElFRUUgNzU0Citwcm92aWRlcyByb3VuZGluZyB0b3dhcmRzIHplcm8gb3IgdG93YXJkcworK1wqKElmIG9yIHRvd2FyZHMgXC1cKihJZgorYXQgdGhlIHByb2dyYW1tZXIncyBvcHRpb24uCisuRWQKKy5QcAorRXhjZXB0aW9uczoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitJRUVFIDc1NCByZWNvZ25pemVzIGZpdmUga2luZHMgb2YgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucywKK2xpc3RlZCBiZWxvdyBpbiBkZWNsaW5pbmcgb3JkZXIgb2YgcHJvYmFibGUgaW1wb3J0YW5jZS4KKy5CbCAtY29sdW1uIC1vZmZzZXQgaW5kZW50ICJJbnZhbGlkIE9wZXJhdGlvbiIgIkdyYWR1YWwgVW5kZXJmbG93IgorLkVtICJFeGNlcHRpb24JRGVmYXVsdCBSZXN1bHQiCitJbnZhbGlkIE9wZXJhdGlvbglcKihOYSwgb3IgRkFMU0UKK092ZXJmbG93CVwoKy1cKihJZgorRGl2aWRlIGJ5IFplcm8JXCgrLVwqKElmCitVbmRlcmZsb3cJR3JhZHVhbCBVbmRlcmZsb3cKK0luZXhhY3QJUm91bmRlZCB2YWx1ZQorLkVsCisuUHAKK05PVEU6IEFuIEV4Y2VwdGlvbiBpcyBub3QgYW4gRXJyb3IgdW5sZXNzIGhhbmRsZWQKK2JhZGx5LgorV2hhdCBtYWtlcyBhIGNsYXNzIG9mIGV4Y2VwdGlvbnMgZXhjZXB0aW9uYWwKK2lzIHRoYXQgbm8gc2luZ2xlIGRlZmF1bHQgcmVzcG9uc2UgY2FuIGJlIHNhdGlzZmFjdG9yeQoraW4gZXZlcnkgaW5zdGFuY2UuCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgYSBkZWZhdWx0CityZXNwb25zZSB3aWxsIHNlcnZlIG1vc3QgaW5zdGFuY2VzIHNhdGlzZmFjdG9yaWx5LAordGhlIHVuc2F0aXNmYWN0b3J5IGluc3RhbmNlcyBjYW5ub3QganVzdGlmeSBhYm9ydGluZworY29tcHV0YXRpb24gZXZlcnkgdGltZSB0aGUgZXhjZXB0aW9uIG9jY3Vycy4KKy5FZAorLlNzIERhdGEgRm9ybWF0cworU2luZ2xlLXByZWNpc2lvbjoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitUeXBlIG5hbWU6CisuVnQgZmxvYXQKKy5QcAorV29yZHNpemU6IDMyIGJpdHMuCisuUHAKK1ByZWNpc2lvbjogMjQgc2lnbmlmaWNhbnQgYml0cywKK3JvdWdobHkgbGlrZSA3IHNpZ25pZmljYW50IGRlY2ltYWxzLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0lmIHggYW5kIHgnIGFyZSBjb25zZWN1dGl2ZSBwb3NpdGl2ZSBzaW5nbGUtcHJlY2lzaW9uCitudW1iZXJzICh0aGV5IGRpZmZlciBieSAxCisuRW0gdWxwICkgLAordGhlbgorLkJkIC1yYWdnZWQgLWNvbXBhY3QKKzUuOWVcLTA4IDwgMC41KioyNCA8ICh4J1wteCkveCBcKDw9IDAuNSoqMjMgPCAxLjJlXC0wNy4KKy5FZAorLkVkCisuUHAKKy5CbCAtY29sdW1uICJYWFgiIC1jb21wYWN0CitSYW5nZToJT3ZlcmZsb3cgdGhyZXNob2xkICA9IDIuMCoqMTI4ID0gMy40ZTM4CisJVW5kZXJmbG93IHRocmVzaG9sZCA9IDAuNSoqMTI2ID0gMS4yZVwtMzgKKy5FbAorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK1VuZGVyZmxvd2VkIHJlc3VsdHMgcm91bmQgdG8gdGhlIG5lYXJlc3QKK2ludGVnZXIgbXVsdGlwbGUgb2YgMC41KioxNDkgPSAxLjRlXC00NS4KKy5FZAorLkVkCisuUHAKK0RvdWJsZS1wcmVjaXNpb246CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorVHlwZSBuYW1lOgorLlZ0IGRvdWJsZQorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK09uIHNvbWUgYXJjaGl0ZWN0dXJlcywKKy5WdCBsb25nIGRvdWJsZQoraXMgdGhlIHRoZSBzYW1lIGFzCisuVnQgZG91YmxlIC4KKy5FZAorLlBwCitXb3Jkc2l6ZTogNjQgYml0cy4KKy5QcAorUHJlY2lzaW9uOiA1MyBzaWduaWZpY2FudCBiaXRzLAorcm91Z2hseSBsaWtlIDE2IHNpZ25pZmljYW50IGRlY2ltYWxzLgorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK0lmIHggYW5kIHgnIGFyZSBjb25zZWN1dGl2ZSBwb3NpdGl2ZSBkb3VibGUtcHJlY2lzaW9uCitudW1iZXJzICh0aGV5IGRpZmZlciBieSAxCisuRW0gdWxwICkgLAordGhlbgorLkJkIC1yYWdnZWQgLWNvbXBhY3QKKzEuMWVcLTE2IDwgMC41Kio1MyA8ICh4J1wteCkveCBcKDw9IDAuNSoqNTIgPCAyLjNlXC0xNi4KKy5FZAorLkVkCisuUHAKKy5CbCAtY29sdW1uICJYWFgiIC1jb21wYWN0CitSYW5nZToJT3ZlcmZsb3cgdGhyZXNob2xkICA9IDIuMCoqMTAyNCA9IDEuOGUzMDgKKwlVbmRlcmZsb3cgdGhyZXNob2xkID0gMC41KioxMDIyID0gMi4yZVwtMzA4CisuRWwKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitVbmRlcmZsb3dlZCByZXN1bHRzIHJvdW5kIHRvIHRoZSBuZWFyZXN0CitpbnRlZ2VyIG11bHRpcGxlIG9mIDAuNSoqMTA3NCA9IDQuOWVcLTMyNC4KKy5FZAorLkVkCisuUHAKK0V4dGVuZGVkLXByZWNpc2lvbjoKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitUeXBlIG5hbWU6CisuVnQgbG9uZyBkb3VibGUKKyh3aGVuIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUpCisuUHAKK1dvcmRzaXplOiA5NiBiaXRzLgorLlBwCitQcmVjaXNpb246IDY0IHNpZ25pZmljYW50IGJpdHMsCityb3VnaGx5IGxpa2UgMTkgc2lnbmlmaWNhbnQgZGVjaW1hbHMuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSWYgeCBhbmQgeCcgYXJlIGNvbnNlY3V0aXZlIHBvc2l0aXZlIGRvdWJsZS1wcmVjaXNpb24KK251bWJlcnMgKHRoZXkgZGlmZmVyIGJ5IDEKKy5FbSB1bHAgKSAsCit0aGVuCisuQmQgLXJhZ2dlZCAtY29tcGFjdAorMS4wZVwtMTkgPCAwLjUqKjYzIDwgKHgnXC14KS94IFwoPD0gMC41Kio2MiA8IDIuMmVcLTE5LgorLkVkCisuRWQKKy5QcAorLkJsIC1jb2x1bW4gIlhYWCIgLWNvbXBhY3QKK1JhbmdlOglPdmVyZmxvdyB0aHJlc2hvbGQgID0gMi4wKioxNjM4NCA9IDEuMmU0OTMyCisJVW5kZXJmbG93IHRocmVzaG9sZCA9IDAuNSoqMTYzODIgPSAzLjRlXC00OTMyCisuRWwKKy5CZCAtcmFnZ2VkIC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CitVbmRlcmZsb3dlZCByZXN1bHRzIHJvdW5kIHRvIHRoZSBuZWFyZXN0CitpbnRlZ2VyIG11bHRpcGxlIG9mIDAuNSoqMTY0NDUgPSA1LjdlXC00OTUzLgorLkVkCisuRWQKKy5QcAorUXVhZC1leHRlbmRlZC1wcmVjaXNpb246CisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorVHlwZSBuYW1lOgorLlZ0IGxvbmcgZG91YmxlCisod2hlbiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlKQorLlBwCitXb3Jkc2l6ZTogMTI4IGJpdHMuCisuUHAKK1ByZWNpc2lvbjogMTEzIHNpZ25pZmljYW50IGJpdHMsCityb3VnaGx5IGxpa2UgMzQgc2lnbmlmaWNhbnQgZGVjaW1hbHMuCisuQmQgLXJhZ2dlZCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorSWYgeCBhbmQgeCcgYXJlIGNvbnNlY3V0aXZlIHBvc2l0aXZlIGRvdWJsZS1wcmVjaXNpb24KK251bWJlcnMgKHRoZXkgZGlmZmVyIGJ5IDEKKy5FbSB1bHAgKSAsCit0aGVuCisuQmQgLXJhZ2dlZCAtY29tcGFjdAorOS42ZVwtMzUgPCAwLjUqKjExMyA8ICh4J1wteCkveCBcKDw9IDAuNSoqMTEyIDwgMi4wZVwtMzQuCisuRWQKKy5FZAorLlBwCisuQmwgLWNvbHVtbiAiWFhYIiAtY29tcGFjdAorUmFuZ2U6CU92ZXJmbG93IHRocmVzaG9sZCAgPSAyLjAqKjE2Mzg0ID0gMS4yZTQ5MzIKKwlVbmRlcmZsb3cgdGhyZXNob2xkID0gMC41KioxNjM4MiA9IDMuNGVcLTQ5MzIKKy5FbAorLkJkIC1yYWdnZWQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKK1VuZGVyZmxvd2VkIHJlc3VsdHMgcm91bmQgdG8gdGhlIG5lYXJlc3QKK2ludGVnZXIgbXVsdGlwbGUgb2YgMC41KioxNjQ5NCA9IDYuNWVcLTQ5NjYuCisuRWQKKy5FZAorLlNzIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24gUmVnYXJkaW5nIEV4Y2VwdGlvbnMKKy5QcAorRm9yIGVhY2gga2luZCBvZiBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIElFRUUgNzU0Citwcm92aWRlcyBhIEZsYWcgdGhhdCBpcyByYWlzZWQgZWFjaCB0aW1lIGl0cyBleGNlcHRpb24KK2lzIHNpZ25hbGVkLCBhbmQgc3RheXMgcmFpc2VkIHVudGlsIHRoZSBwcm9ncmFtIHJlc2V0cworaXQuCitQcm9ncmFtcyBtYXkgYWxzbyB0ZXN0LCBzYXZlIGFuZCByZXN0b3JlIGEgZmxhZy4KK1RodXMsIElFRUUgNzU0IHByb3ZpZGVzIHRocmVlIHdheXMgYnkgd2hpY2ggcHJvZ3JhbXMKK21heSBjb3BlIHdpdGggZXhjZXB0aW9ucyBmb3Igd2hpY2ggdGhlIGRlZmF1bHQgcmVzdWx0CittaWdodCBiZSB1bnNhdGlzZmFjdG9yeToKKy5CbCAtZW51bQorLkl0CitUZXN0IGZvciBhIGNvbmRpdGlvbiB0aGF0IG1pZ2h0IGNhdXNlIGFuIGV4Y2VwdGlvbgorbGF0ZXIsIGFuZCBicmFuY2ggdG8gYXZvaWQgdGhlIGV4Y2VwdGlvbi4KKy5JdAorVGVzdCBhIGZsYWcgdG8gc2VlIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorc2luY2UgdGhlIHByb2dyYW0gbGFzdCByZXNldCBpdHMgZmxhZy4KKy5JdAorVGVzdCBhIHJlc3VsdCB0byBzZWUgd2hldGhlciBpdCBpcyBhIHZhbHVlIHRoYXQgb25seQorYW4gZXhjZXB0aW9uIGNvdWxkIGhhdmUgcHJvZHVjZWQuCisuUHAKK0NBVVRJT046IFRoZSBvbmx5IHJlbGlhYmxlIHdheXMgdG8gZGlzY292ZXIKK3doZXRoZXIgVW5kZXJmbG93IGhhcyBvY2N1cnJlZCBhcmUgdG8gdGVzdCB3aGV0aGVyCitwcm9kdWN0cyBvciBxdW90aWVudHMgbGllIGNsb3NlciB0byB6ZXJvIHRoYW4gdGhlCit1bmRlcmZsb3cgdGhyZXNob2xkLCBvciB0byB0ZXN0IHRoZSBVbmRlcmZsb3cKK2ZsYWcuCisoU3VtcyBhbmQgZGlmZmVyZW5jZXMgY2Fubm90IHVuZGVyZmxvdyBpbgorSUVFRSA3NTQ7IGlmIHggXCghPSB5IHRoZW4geFwteSBpcyBjb3JyZWN0IHRvCitmdWxsIHByZWNpc2lvbiBhbmQgY2VydGFpbmx5IG5vbnplcm8gcmVnYXJkbGVzcyBvZgoraG93IHRpbnkgaXQgbWF5IGJlLikKK1Byb2R1Y3RzIGFuZCBxdW90aWVudHMgdGhhdAordW5kZXJmbG93IGdyYWR1YWxseSBjYW4gbG9zZSBhY2N1cmFjeSBncmFkdWFsbHkKK3dpdGhvdXQgdmFuaXNoaW5nLCBzbyBjb21wYXJpbmcgdGhlbSB3aXRoIHplcm8KKyhhcyBvbmUgbWlnaHQgb24gYSBWQVgpIHdpbGwgbm90IHJldmVhbCB0aGUgbG9zcy4KK0ZvcnR1bmF0ZWx5LCBpZiBhIGdyYWR1YWxseSB1bmRlcmZsb3dlZCB2YWx1ZSBpcworZGVzdGluZWQgdG8gYmUgYWRkZWQgdG8gc29tZXRoaW5nIGJpZ2dlciB0aGFuIHRoZQordW5kZXJmbG93IHRocmVzaG9sZCwgYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwKK2RpZ2l0cyBsb3N0IHRvIGdyYWR1YWwgdW5kZXJmbG93IHdpbGwgbm90IGJlIG1pc3NlZAorYmVjYXVzZSB0aGV5IHdvdWxkIGhhdmUgYmVlbiByb3VuZGVkIG9mZiBhbnl3YXkuCitTbyBncmFkdWFsIHVuZGVyZmxvd3MgYXJlIHVzdWFsbHkKKy5FbSBwcm92YWJseQoraWdub3JhYmxlLgorVGhlIHNhbWUgY2Fubm90IGJlIHNhaWQgb2YgdW5kZXJmbG93cyBmbHVzaGVkIHRvIDAuCisuRWwKKy5QcAorQXQgdGhlIG9wdGlvbiBvZiBhbiBpbXBsZW1lbnRvciBjb25mb3JtaW5nIHRvIElFRUUgNzU0LAorb3RoZXIgd2F5cyB0byBjb3BlIHdpdGggZXhjZXB0aW9ucyBtYXkgYmUgcHJvdmlkZWQ6CisuQmwgLWVudW0KKy5JdAorQUJPUlQuCitUaGlzIG1lY2hhbmlzbSBjbGFzc2lmaWVzIGFuIGV4Y2VwdGlvbiBpbgorYWR2YW5jZSBhcyBhbiBpbmNpZGVudCB0byBiZSBoYW5kbGVkIGJ5IG1lYW5zCit0cmFkaXRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBlcnJvci1oYW5kbGluZworc3RhdGVtZW50cyBsaWtlICJPTiBFUlJPUiBHTyBUTyAuLi4iLgorRGlmZmVyZW50CitsYW5ndWFnZXMgb2ZmZXIgZGlmZmVyZW50IGZvcm1zIG9mIHRoaXMgc3RhdGVtZW50LAorYnV0IG1vc3Qgc2hhcmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6CisuQmwgLWRhc2gKKy5JdAorTm8gbWVhbnMgaXMgcHJvdmlkZWQgdG8gc3Vic3RpdHV0ZSBhIHZhbHVlIGZvcgordGhlIG9mZmVuZGluZyBvcGVyYXRpb24ncyByZXN1bHQgYW5kIHJlc3VtZQorY29tcHV0YXRpb24gZnJvbSB3aGF0IG1heSBiZSB0aGUgbWlkZGxlIG9mIGFuCitleHByZXNzaW9uLgorQW4gZXhjZXB0aW9uYWwgcmVzdWx0IGlzIGFiYW5kb25lZC4KKy5JdAorSW4gYSBzdWJwcm9ncmFtIHRoYXQgbGFja3MgYW4gZXJyb3ItaGFuZGxpbmcKK3N0YXRlbWVudCwgYW4gZXhjZXB0aW9uIGNhdXNlcyB0aGUgc3VicHJvZ3JhbSB0bworYWJvcnQgd2l0aGluIHdoYXRldmVyIHByb2dyYW0gY2FsbGVkIGl0LCBhbmQgc28KK29uIGJhY2sgdXAgdGhlIGNoYWluIG9mIGNhbGxpbmcgc3VicHJvZ3JhbXMgdW50aWwKK2FuIGVycm9yLWhhbmRsaW5nIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZCBvciB0aGUKK3dob2xlIHRhc2sgaXMgYWJvcnRlZCBhbmQgbWVtb3J5IGlzIGR1bXBlZC4KKy5FbAorLkl0CitTVE9QLgorVGhpcyBtZWNoYW5pc20sIHJlcXVpcmluZyBhbiBpbnRlcmFjdGl2ZQorZGVidWdnaW5nIGVudmlyb25tZW50LCBpcyBtb3JlIGZvciB0aGUgcHJvZ3JhbW1lcgordGhhbiB0aGUgcHJvZ3JhbS4KK0l0IGNsYXNzaWZpZXMgYW4gZXhjZXB0aW9uIGluCithZHZhbmNlIGFzIGEgc3ltcHRvbSBvZiBhIHByb2dyYW1tZXIncyBlcnJvcjsgdGhlCitleGNlcHRpb24gc3VzcGVuZHMgZXhlY3V0aW9uIGFzIG5lYXIgYXMgaXQgY2FuIHRvCit0aGUgb2ZmZW5kaW5nIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSBwcm9ncmFtbWVyIGNhbgorbG9vayBhcm91bmQgdG8gc2VlIGhvdyBpdCBoYXBwZW5lZC4KK1F1aXRlIG9mdGVuCit0aGUgZmlyc3Qgc2V2ZXJhbCBleGNlcHRpb25zIHR1cm4gb3V0IHRvIGJlIHF1aXRlCit1bmV4Y2VwdGlvbmFibGUsIHNvIHRoZSBwcm9ncmFtbWVyIG91Z2h0IGlkZWFsbHkKK3RvIGJlIGFibGUgdG8gcmVzdW1lIGV4ZWN1dGlvbiBhZnRlciBlYWNoIG9uZSBhcyBpZgorZXhlY3V0aW9uIGhhZCBub3QgYmVlbiBzdG9wcGVkLgorLkl0CitcJi4uLiBPdGhlciB3YXlzIGxpZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCisuRWwKKy5QcAorSWRlYWxseSwgZWFjaAorZWxlbWVudGFyeSBmdW5jdGlvbiBzaG91bGQgYWN0IGFzIGlmIGl0IHdlcmUgaW5kaXZpc2libGUsIG9yCithdG9taWMsIGluIHRoZSBzZW5zZSB0aGF0IC4uLgorLkJsIC1lbnVtCisuSXQKK05vIGV4Y2VwdGlvbiBzaG91bGQgYmUgc2lnbmFsZWQgdGhhdCBpcyBub3QgZGVzZXJ2ZWQgYnkKK3RoZSBkYXRhIHN1cHBsaWVkIHRvIHRoYXQgZnVuY3Rpb24uCisuSXQKK0FueSBleGNlcHRpb24gc2lnbmFsZWQgc2hvdWxkIGJlIGlkZW50aWZpZWQgd2l0aCB0aGF0CitmdW5jdGlvbiByYXRoZXIgdGhhbiB3aXRoIG9uZSBvZiBpdHMgc3Vicm91dGluZXMuCisuSXQKK1RoZSBpbnRlcm5hbCBiZWhhdmlvciBvZiBhbiBhdG9taWMgZnVuY3Rpb24gc2hvdWxkIG5vdAorYmUgZGlzcnVwdGVkIHdoZW4gYSBjYWxsaW5nIHByb2dyYW0gY2hhbmdlcyBmcm9tCitvbmUgdG8gYW5vdGhlciBvZiB0aGUgZml2ZSBvciBzbyB3YXlzIG9mIGhhbmRsaW5nCitleGNlcHRpb25zIGxpc3RlZCBhYm92ZSwgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24KK29mIHRoZSBmdW5jdGlvbiBtYXkgYmUgY29ycmVsYXRlZCBpbnRlbnRpb25hbGx5Cit3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZy4KKy5FbAorLlBwCitUaGUgZnVuY3Rpb25zIGluCisuTm0gbGlibQorYXJlIG9ubHkgYXBwcm94aW1hdGVseSBhdG9taWMuCitUaGV5IHNpZ25hbCBubyBpbmFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBleGNlcHQgcG9zc2libHkgLi4uCisuQmwgLXRhZyAtd2lkdGggaW5kZW50IC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgWG8KK092ZXIvVW5kZXJmbG93CisuWGMKK3doZW4gYSByZXN1bHQsIGlmIHByb3Blcmx5IGNvbXB1dGVkLCBtaWdodCBoYXZlIGxhaW4gYmFyZWx5IHdpdGhpbiByYW5nZSwgYW5kCisuSXQgWG8KK0luZXhhY3QgaW4KKy5GbiBjYWJzICwKKy5GbiBjYnJ0ICwKKy5GbiBoeXBvdCAsCisuRm4gbG9nMTAKK2FuZAorLkZuIHBvdworLlhjCit3aGVuIGl0IGhhcHBlbnMgdG8gYmUgZXhhY3QsIHRoYW5rcyB0byBmb3J0dWl0b3VzIGNhbmNlbGxhdGlvbiBvZiBlcnJvcnMuCisuRWwKK090aGVyd2lzZSwgLi4uCisuQmwgLXRhZyAtd2lkdGggaW5kZW50IC1vZmZzZXQgaW5kZW50IC1jb21wYWN0CisuSXQgWG8KK0ludmFsaWQgT3BlcmF0aW9uIGlzIHNpZ25hbGVkIG9ubHkgd2hlbgorLlhjCithbnkgcmVzdWx0IGJ1dCBcKihOYSB3b3VsZCBwcm9iYWJseSBiZSBtaXNsZWFkaW5nLgorLkl0IFhvCitPdmVyZmxvdyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYwordGhlIGV4YWN0IHJlc3VsdCB3b3VsZCBiZSBmaW5pdGUgYnV0IGJleW9uZCB0aGUgb3ZlcmZsb3cgdGhyZXNob2xkLgorLkl0IFhvCitEaXZpZGUtYnktWmVybyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYworYSBmdW5jdGlvbiB0YWtlcyBleGFjdGx5IGluZmluaXRlIHZhbHVlcyBhdCBmaW5pdGUgb3BlcmFuZHMuCisuSXQgWG8KK1VuZGVyZmxvdyBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYwordGhlIGV4YWN0IHJlc3VsdCB3b3VsZCBiZSBub256ZXJvIGJ1dCB0aW5pZXIgdGhhbiB0aGUgdW5kZXJmbG93IHRocmVzaG9sZC4KKy5JdCBYbworSW5leGFjdCBpcyBzaWduYWxlZCBvbmx5IHdoZW4KKy5YYworZ3JlYXRlciByYW5nZSBvciBwcmVjaXNpb24gd291bGQgYmUgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgZXhhY3QgcmVzdWx0LgorLkVsCisuU2ggU0VFIEFMU08KKy5YciBmZW52IDMgLAorLlhyIGllZWVfdGVzdCAzICwKKy5YciBtYXRoIDMKKy5QcAorQW4gZXhwbGFuYXRpb24gb2YgSUVFRSA3NTQgYW5kIGl0cyBwcm9wb3NlZCBleHRlbnNpb24gcDg1NAord2FzIHB1Ymxpc2hlZCBpbiB0aGUgSUVFRSBtYWdhemluZSBNSUNSTyBpbiBBdWd1c3QgMTk4NCB1bmRlcgordGhlIHRpdGxlICJBIFByb3Bvc2VkIFJhZGl4LSBhbmQgV29yZC1sZW5ndGgtaW5kZXBlbmRlbnQKK1N0YW5kYXJkIGZvciBGbG9hdGluZy1wb2ludCBBcml0aG1ldGljIiBieQorLkFuICJXLiBKLiBDb2R5IgorZXQgYWwuCitUaGUgbWFudWFscyBmb3IgUGFzY2FsLCBDIGFuZCBCQVNJQyBvbiB0aGUgQXBwbGUgTWFjaW50b3NoCitkb2N1bWVudCB0aGUgZmVhdHVyZXMgb2YgSUVFRSA3NTQgcHJldHR5IHdlbGwuCitBcnRpY2xlcyBpbiB0aGUgSUVFRSBtYWdhemluZSBDT01QVVRFUiB2b2wuXCYgMTQgbm8uXCYgMyAoTWFyLlwmCisxOTgxKSwgYW5kIGluIHRoZSBBQ00gU0lHTlVNIE5ld3NsZXR0ZXIgU3BlY2lhbCBJc3N1ZSBvZgorT2N0LlwmIDE5NzksIG1heSBiZSBoZWxwZnVsIGFsdGhvdWdoIHRoZXkgcGVydGFpbiB0bworc3VwZXJzZWRlZCBkcmFmdHMgb2YgdGhlIHN0YW5kYXJkLgorLlNoIFNUQU5EQVJEUworLlN0IC1pZWVlNzU0CmRpZmYgLS1naXQgYS9saWJtL21hbi9pZWVlX3Rlc3QuMyBiL2xpYm0vbWFuL2llZWVfdGVzdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmI2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9pZWVlX3Rlc3QuMwpAQCAtMCwwICsxLDkzIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vaWVlZV90ZXN0LjMsdiAxLjEzIDIwMDUvMTEvMTcgMTM6MDA6MDAgcnUgRXhwICQKKy5cIgorLkRkIE5vdmVtYmVyIDYsIDIwMDUKKy5EdCBJRUVFX1RFU1QgMworLk9zCisuU2ggTkFNRQorLk5tIHNjYWxiICwKKy5ObSBzY2FsYmYgLAorLk5tIHNpZ25pZmljYW5kICwKKy5ObSBzaWduaWZpY2FuZGYKKy5OZCBJRUVFIHRlc3QgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIHNjYWxiICJkb3VibGUgeCIgImRvdWJsZSBuIgorLkZ0IGZsb2F0CisuRm4gc2NhbGJmICJmbG9hdCB4IiAiZmxvYXQgbiIKKy5GdCBkb3VibGUKKy5GbiBzaWduaWZpY2FuZCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzaWduaWZpY2FuZGYgImZsb2F0IHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZXNlIGZ1bmN0aW9ucyBhbGxvdyB1c2VycyB0byB0ZXN0IGNvbmZvcm1hbmNlIHRvCisuU3QgLWllZWU3NTQgLgorVGhlaXIgdXNlIGlzIG5vdCBvdGhlcndpc2UgcmVjb21tZW5kZWQuCisuUHAKKy5GbiBzY2FsYiB4IG4KK2FuZAorLkZuIHNjYWxiZiB4IG4KK3JldHVybgorLkZhIHggTnMgXCgqKigyKiogTnMgRmEgbiApCitjb21wdXRlZCBieSBleHBvbmVudCBtYW5pcHVsYXRpb24uCitJZgorLkZhIG4KK2lzIG5vdCBhbiBpbnRlZ2VyLCBcKihQbVwqKElmLCBvciBhbiBcKihOYSwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKy5QcAorLkZuIHNpZ25pZmljYW5kIHgKK2FuZAorLkZuIHNpZ25pZmljYW5kZiB4CityZXR1cm4KKy5GYSBzaWcgLAord2hlcmUKKy5GYSB4Cis6PQorLkZhIHNpZyBObyBcKCoqIDIqKiBOcyBGYSBuCit3aXRoIDEgXCg8PQorLkZhIHNpZworPCAyLgorLkZuIHNpZ25pZmljYW5kIHgKK2FuZAorLkZuIHNpZ25pZmljYW5kZiB4CithcmUgbm90IGRlZmluZWQgd2hlbgorLkZhIHgKK2lzIDAsIFwqKFBtXCooSWYsIG9yIFwqKE5hLgorLlNoIFNFRSBBTFNPCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKKy5TdCAtaWVlZTc1NApkaWZmIC0tZ2l0IGEvbGlibS9tYW4vaWxvZ2IuMyBiL2xpYm0vbWFuL2lsb2diLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhYzc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2lsb2diLjMKQEAgLTAsMCArMSwxMjcgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9pbG9nYi4zLHYgMS4zIDIwMDUvMTEvMTcgMTM6MDA6MDAgcnUgRXhwICQKKy5cIgorLkRkIE5vdmVtYmVyIDYsIDIwMDUKKy5EdCBJTE9HQiAzCisuT3MKKy5TaCBOQU1FCisuTm0gaWxvZ2IgLAorLk5tIGlsb2diZiAsCisuTm0gaWxvZ2JsICwKKy5ObSBsb2diICwKKy5ObSBsb2diZgorLk5kIGV4dHJhY3QgZXhwb25lbnQKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgaW50CisuRm4gaWxvZ2IgImRvdWJsZSB4IgorLkZ0IGludAorLkZuIGlsb2diZiAiZmxvYXQgeCIKKy5GdCBpbnQKKy5GbiBpbG9nYmwgImxvbmcgZG91YmxlIHgiCisuRnQgZG91YmxlCisuRm4gbG9nYiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBsb2diZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorLkZuIGlsb2diICwKKy5GbiBpbG9nYmYKK2FuZAorLkZuIGlsb2dibAorcmV0dXJuCisuRmEgeCBOcyAncyBleHBvbmVudAoraW4gaW50ZWdlciBmb3JtYXQuCisuRm4gaWxvZ2IgXCooUG1cKihJZgorcmV0dXJucworLkR2IElOVF9NQVggLAorLkZuIGlsb2diIFwqKFBtXCooTmEKK3JldHVybnMKKy5EdiBGUF9JTE9HQk5BTiAsCithbmQKKy5GbiBpbG9nYiAwCityZXR1cm5zCisuRHYgRlBfSUxPR0IwIC4KKy5QcAorLkZuIGxvZ2IgeAorYW5kCisuRm4gbG9nYmYgeAorcmV0dXJuCisuRmEgeCBOcyAncyBleHBvbmVudAoraW4gZmxvYXRpbmdcLXBvaW50IGZvcm1hdCB3aXRoIHRoZSBzYW1lIHByZWNpc2lvbiBhcworLkZhIHggLgorLkZuIGxvZ2IgXCooUG1cKihJZgorcmV0dXJucyArXCooSWYsIGFuZAorLkZuIGxvZ2IgMAorcmV0dXJucyAtXCooSWYgd2l0aCBhIGRpdmlzaW9uIGJ5IHplcm8gZXhjZXB0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgZnJleHAgMyAsCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNjYWxibiAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBpbG9nYiAsCisuRm4gaWxvZ2JmICwKKy5GbiBpbG9nYmwgLAorLkZuIGxvZ2IKK2FuZAorLkZuIGxvZ2JmCityb3V0aW5lcyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLkZuIGxvZ2IKK2FuZAorLkZuIGxvZ2JmCitpbXBsZW1lbnQgdGhlIGxvZ2IgZnVuY3Rpb24gcmVjb21tZW5kZWQgYnkKKy5TdCAtaWVlZTc1NCAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gbG9nYgorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjMgLgorVGhlCisuRm4gaWxvZ2IKK2Z1bmN0aW9uIGFwcGVhcmVkIGluCisuRnggMS4xLjUgLgorVGhlCisuRm4gaWxvZ2JmCithbmQKKy5GbiBsb2diZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuRnggMi4wIC4KK1RoZQorLkZuIGlsb2dibAorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5GeCA1LjQgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vajAuMyBiL2xpYm0vbWFuL2owLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjZDUxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL2owLjMKQEAgLTAsMCArMSwxNDIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWowLjMJNi43IChCZXJrZWxleSkgNC8xOS85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2owLjMsdiAxLjEzIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDE0LCAyMDA1CisuRHQgSjAgMworLk9zCisuU2ggTkFNRQorLk5tIGowICwKKy5ObSBqMGYgLAorLk5tIGoxICwKKy5ObSBqMWYgLAorLk5tIGpuICwKKy5ObSBqbmYgLAorLk5tIHkwICwKKy5ObSB5MGYgLAorLk5tIHkxICwKKy5ObSB5MWYgLAorLk5tIHluICwKKy5ObSB5bmYKKy5OZCBCZXNzZWwgZnVuY3Rpb25zIG9mIGZpcnN0IGFuZCBzZWNvbmQga2luZAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBqMCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBqMGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gajEgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gajFmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIGpuICJpbnQgbiIgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gam5mICJpbnQgbiIgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4geTAgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4geTBmICJmbG9hdCB4IgorLkZ0IGRvdWJsZQorLkZuIHkxICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHkxZiAiZmxvYXQgeCIKKy5GdCBkb3VibGUKKy5GbiB5biAiaW50IG4iICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHluZiAiaW50IG4iICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUgZnVuY3Rpb25zCisuRm4gajAgLAorLkZuIGowZiAsCisuRm4gajEKK2FuZAorLkZuIGoxZgorY29tcHV0ZSB0aGUKKy5FbSBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQgb2YgdGhlIG9yZGVyCiswIGFuZCB0aGUKKy5FbSBvcmRlcgorMSwgcmVzcGVjdGl2ZWx5LAorZm9yIHRoZQorcmVhbCB2YWx1ZQorLkZhIHggOwordGhlIGZ1bmN0aW9ucworLkZuIGpuCithbmQKKy5GbiBqbmYKK2NvbXB1dGUgdGhlCisuRW0gQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIG9mIHRoZSBpbnRlZ2VyCisuRW0gb3JkZXIKKy5GYSBuCitmb3IgdGhlIHJlYWwgdmFsdWUKKy5GYSB4IC4KKy5QcAorVGhlIGZ1bmN0aW9ucworLkZuIHkwICwKKy5GbiB5MGYgLAorLkZuIHkxICwKK2FuZAorLkZuIHkxZgorY29tcHV0ZSB0aGUgbGluZWFybHkgaW5kZXBlbmRlbnQKKy5FbSBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kIG9mIHRoZSBvcmRlcgorMCBhbmQgdGhlCisuRW0gb3JkZXIKKzEsIHJlc3BlY3RpdmVseSwKK2ZvciB0aGUKK3Bvc2l0aXZlCisuRW0gcmVhbAordmFsdWUKKy5GYSB4IDsKK3RoZSBmdW5jdGlvbnMKKy5GbiB5bgorYW5kCisuRm4geW5mCitjb21wdXRlIHRoZQorLkVtIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgZm9yIHRoZSBpbnRlZ2VyCisuRW0gb3JkZXIKKy5GYSBuCitmb3IgdGhlIHBvc2l0aXZlCisuRW0gcmVhbAordmFsdWUKKy5GYSB4IC4KKy5TaCBSRVRVUk4gVkFMVUVTCitJZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHN1Y2Nlc3NmdWwsCit0aGUgY29tcHV0ZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisuU2ggU0VFIEFMU08KKy5YciBtYXRoIDMKKy5TaCBISVNUT1JZCitUaGlzIHNldCBvZiBmdW5jdGlvbnMKK2FwcGVhcmVkIGluCisuQXQgdjcgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vbGdhbW1hLjMgYi9saWJtL21hbi9sZ2FtbWEuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbGdhbW1hLjMKQEAgLTAsMCArMSwxODUgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWxnYW1tYS4zCTYuNiAoQmVya2VsZXkpIDEyLzMvOTIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9sZ2FtbWEuMyx2IDEuMjIgMjAwNS8wMS8xNiAxNjo0NjoxNCBydSBFeHAgJAorLlwiCisuRGQgSmFudWFyeSAxNCwgMjAwNQorLkR0IExHQU1NQSAzCisuT3MKKy5TaCBOQU1FCisuTm0gbGdhbW1hICwKKy5ObSBsZ2FtbWFfciAsCisuTm0gbGdhbW1hZiAsCisuTm0gbGdhbW1hZl9yICwKKy5ObSBnYW1tYSAsCisuTm0gZ2FtbWFfciAsCisuTm0gZ2FtbWFmICwKKy5ObSBnYW1tYWZfciAsCisuTm0gdGdhbW1hCisuTmQgbG9nIGdhbW1hIGZ1bmN0aW9ucywgZ2FtbWEgZnVuY3Rpb24KKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZXh0ZXJuIGludAorLkZhIHNpZ25nYW0gOworLnNwCisuRnQgZG91YmxlCisuRm4gbGdhbW1hICJkb3VibGUgeCIKKy5GdCBkb3VibGUKKy5GbiBsZ2FtbWFfciAiZG91YmxlIHgiICJpbnQgKnNpZ25nYW1wIgorLkZ0IGZsb2F0CisuRm4gbGdhbW1hZiAiZmxvYXQgeCIKKy5GdCBmbG9hdAorLkZuIGxnYW1tYWZfciAiZmxvYXQgeCIgImludCAqc2lnbmdhbXAiCisuRnQgZG91YmxlCisuRm4gZ2FtbWEgImRvdWJsZSB4IgorLkZ0IGRvdWJsZQorLkZuIGdhbW1hX3IgImRvdWJsZSB4IiAiaW50ICpzaWduZ2FtcCIKKy5GdCBmbG9hdAorLkZuIGdhbW1hZiAiZmxvYXQgeCIKKy5GdCBmbG9hdAorLkZuIGdhbW1hZl9yICJmbG9hdCB4IiAiaW50ICpzaWduZ2FtcCIKKy5GdCBkb3VibGUKKy5GbiB0Z2FtbWEgImRvdWJsZSB4IgorLlNoIERFU0NSSVBUSU9OCisuRm4gbGdhbW1hIHgKK2FuZAorLkZuIGxnYW1tYWYgeAorLmlmIHQgXHtcCityZXR1cm4gbG5cfHxcKCpHKHgpfCB3aGVyZQorLkJkIC11bmZpbGxlZCAtb2Zmc2V0IGluZGVudAorXCgqRyh4KSA9IFwoaXNcZFxzOFx6MFxzMTBcdVx1XHM4XChpZlxzMTBcZCB0XHVcczh4XC0xXHMxMFxkIGVcdVxzOFwtdFxzMTBcZCBkdAlmb3IgeCA+IDAgYW5kCitcKCpHKHgpID0gXCgqcC8oXCgqRygxXC14KVx8c2luKFwoKnB4KSkJZm9yIHggPCAxLgorLkVkCisuXH0KKy5pZiBuIFwKK3JldHVybiBsblx8fFwoKkcoeCl8LgorLlBwCitUaGUgZXh0ZXJuYWwgaW50ZWdlcgorLkZhIHNpZ25nYW0KK3JldHVybnMgdGhlIHNpZ24gb2YgXCgqRyh4KS4KKy5QcAorLkZuIGxnYW1tYV9yIHggc2lnbmdhbXAKK2FuZAorLkZuIGxnYW1tYWZfciB4IHNpZ25nYW1wCitwcm92aWRlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMKKy5GbiBsZ2FtbWEgeAorYW5kCisuRm4gbGdhbW1hZiB4CitidXQgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYW4gaW50ZWdlciB0byBzdG9yZSB0aGUgc2lnbiBvZiBcKCpHKHgpLgorLlBwCisuRm4gZ2FtbWEgLAorLkZuIGdhbW1hZiAsCisuRm4gZ2FtbWFfciAsCithbmQKKy5GbiBnYW1tYWZfcgorYXJlIGRlcHJlY2F0ZWQgYWxpYXNlcyBmb3IKKy5GbiBsZ2FtbWEgLAorLkZuIGxnYW1tYWYgLAorLkZuIGxnYW1tYV9yICwKK2FuZAorLkZuIGxnYW1tYWZfciAsCityZXNwZWN0aXZlbHkuCisuRm4gdGdhbW1hIHgKK3JldHVybnMgXCgqRyh4KSwgd2l0aCBubyBlZmZlY3Qgb24KKy5GYSBzaWduZ2FtIC4KKy5TaCBJRElPU1lOQ1JBU0lFUworRG8gbm90IHVzZSB0aGUgZXhwcmVzc2lvbgorLkRxIExpIHNpZ25nYW1cKCoqZXhwKGxnYW1tYSh4KSkKK3RvIGNvbXB1dGUgZyA6PSBcKCpHKHgpLgorSW5zdGVhZCB1c2UgYSBwcm9ncmFtIGxpa2UgdGhpcyAoaW4gQyk6CisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2xnID0gbGdhbW1hKHgpOyBnID0gc2lnbmdhbVwoKipleHAobGcpOworLkVkCisuUHAKK09ubHkgYWZ0ZXIKKy5GbiBsZ2FtbWEKK29yCisuRm4gbGdhbW1hZgoraGFzIHJldHVybmVkIGNhbiBzaWduZ2FtIGJlIGNvcnJlY3QuCisuUHAKK0ZvciBhcmd1bWVudHMgaW4gaXRzIHJhbmdlLAorLkZuIHRnYW1tYQoraXMgcHJlZmVycmVkLCBhcyBmb3IgcG9zaXRpdmUgYXJndW1lbnRzCitpdCBpcyBhY2N1cmF0ZSB0byB3aXRoaW4gb25lIHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UuCitFeHBvbmVudGlhdGlvbiBvZgorLkZuIGxnYW1tYQord2lsbCBsb3NlIHVwIHRvIDEwIHNpZ25pZmljYW50IGJpdHMuCisuU2ggUkVUVVJOIFZBTFVFUworLkZuIGdhbW1hICwKKy5GbiBnYW1tYV9yICwKKy5GbiBnYW1tYWYgLAorLkZuIGdhbW1hZl9yICwKKy5GbiBsZ2FtbWEgLAorLkZuIGxnYW1tYV9yICwKKy5GbiBsZ2FtbWFmICwKK2FuZAorLkZuIGxnYW1tYWZfcgorcmV0dXJuIGFwcHJvcHJpYXRlIHZhbHVlcyB1bmxlc3MgYW4gYXJndW1lbnQgaXMgb3V0IG9mIHJhbmdlLgorT3ZlcmZsb3cgd2lsbCBvY2N1ciBmb3Igc3VmZmljaWVudGx5IGxhcmdlIHBvc2l0aXZlIHZhbHVlcywgYW5kCitub24tcG9zaXRpdmUgaW50ZWdlcnMuCitGb3IgbGFyZ2Ugbm9uLWludGVnZXIgbmVnYXRpdmUgdmFsdWVzLAorLkZuIHRnYW1tYQord2lsbCB1bmRlcmZsb3cuCisuU2ggU0VFIEFMU08KKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxnYW1tYQorYW5kCisuRm4gdGdhbW1hCitmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gbGdhbW1hCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCitUaGUKKy5GbiBnYW1tYQorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjQKK2FzIGEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZWQgXCgqRyh4KS4KK1RoaXMgdmVyc2lvbiB3YXMgdXNlZCBpbgorLkZ4IDEuMSAuCitUaGUgbmFtZQorLkZuIGdhbW1hCit3YXMgb3JpZ2luYWxseSBkZWRpY2F0ZWQgdG8gdGhlCisuRm4gbGdhbW1hCitmdW5jdGlvbiwKK2FuZCB0aGF0IHVzYWdlIHdhcyByZXN0b3JlZCBieSBzd2l0Y2hpbmcgdG8gU3VuJ3MgZmRsaWJtIGluCisuRnggMS4xLjUgLgorVGhlCisuRm4gdGdhbW1hCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkZ4IDUuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9scmludC4zIGIvbGlibS9tYW4vbHJpbnQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlMDkzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbHJpbnQuMwpAQCAtMCwwICsxLDk0IEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbHJpbnQuMyx2IDEuMiAyMDA1LzAxLzEzIDEwOjQzOjAxIHJ1IEV4cCAkCisuXCIKKy5EZCBKYW51YXJ5IDExLCAyMDA1CisuRHQgTFJJTlQgMworLk9zCisuU2ggTkFNRQorLk5tIGxscmludCAsCisuTm0gbGxyaW50ZiAsCisuTm0gbHJpbnQgLAorLk5tIGxyaW50ZgorLk5kICJjb252ZXJ0IHRvIGludGVnZXIiCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0ICJsb25nIGxvbmciCisuRm4gbGxyaW50ICJkb3VibGUgeCIKKy5GdCAibG9uZyBsb25nIgorLkZuIGxscmludGYgImZsb2F0IHgiCisuRnQgbG9uZworLkZuIGxyaW50ICJkb3VibGUgeCIKKy5GdCBsb25nCisuRm4gbHJpbnRmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBscmludAorZnVuY3Rpb24gcmV0dXJucyB0aGUgaW50ZWdlciBuZWFyZXN0IHRvIGl0cyBhcmd1bWVudAorLkZhIHgKK2FjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLgorSWYgdGhlIHJvdW5kZWQgcmVzdWx0IGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRlZCBhcyBhCisuVnQgbG9uZwordmFsdWUsIGFuIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuCitPdGhlcndpc2UsIGlmCisuRmEgeAoraXMgbm90IGFuIGludGVnZXIsCisuRm4gbHJpbnQKK3JhaXNlcyBhbiBpbmV4YWN0IGV4Y2VwdGlvbi4KK1doZW4gdGhlIHJvdW5kZWQgcmVzdWx0IGlzIHJlcHJlc2VudGFibGUgYXMgYQorLlZ0IGxvbmcgLAordGhlIGV4cHJlc3Npb24KKy5GbiBscmludCB4CitpcyBlcXVpdmFsZW50IHRvCisuUG8gVnQgbG9uZyBQYyBOcyBGbiByaW50IHgKKyhhbHRob3VnaCB0aGUgZm9ybWVyIG1heSBiZSBtb3JlIGVmZmljaWVudCkuCisuUHAKK1RoZQorLkZuIGxscmludCAsCisuRm4gbGxyaW50ZiAsCithbmQKKy5GbiBscmludGYKK2Z1bmN0aW9ucyBkaWZmZXIgZnJvbQorLkZuIGxyaW50Citvbmx5IGluIHRoZWlyIGlucHV0IGFuZCBvdXRwdXQgdHlwZXMuCisuU2ggU0VFIEFMU08KKy5YciBscm91bmQgMyAsCisuWHIgbWF0aCAzICwKKy5YciByaW50IDMgLAorLlhyIHJvdW5kIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxscmludCAsCisuRm4gbGxyaW50ZiAsCisuRm4gbHJpbnQgLAorYW5kCisuRm4gbHJpbnRmCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGVzZSByb3V0aW5lcyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuNCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9scm91bmQuMyBiL2xpYm0vbWFuL2xyb3VuZC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTUzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9scm91bmQuMwpAQCAtMCwwICsxLDExMiBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5vcmc+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL2xyb3VuZC4zLHYgMS40IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIEFwcmlsIDcsIDIwMDUKKy5EdCBMUk9VTkQgMworLk9zCisuU2ggTkFNRQorLk5tIGxscm91bmQgLAorLk5tIGxscm91bmRmICwKKy5ObSBsbHJvdW5kbCAsCisuTm0gbHJvdW5kICwKKy5ObSBscm91bmRmICwKKy5ObSBscm91bmRsCisuTmQgImNvbnZlcnQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSIKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgImxvbmcgbG9uZyIKKy5GbiBsbHJvdW5kICJkb3VibGUgeCIKKy5GdCAibG9uZyBsb25nIgorLkZuIGxscm91bmRmICJmbG9hdCB4IgorLkZ0ICJsb25nIGxvbmciCisuRm4gbGxyb3VuZGwgImxvbmcgZG91YmxlIHgiCisuRnQgbG9uZworLkZuIGxyb3VuZCAiZG91YmxlIHgiCisuRnQgbG9uZworLkZuIGxyb3VuZGYgImZsb2F0IHgiCisuRnQgbG9uZworLkZuIGxyb3VuZGwgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIGxyb3VuZAorZnVuY3Rpb24gcmV0dXJucyB0aGUgaW50ZWdlciBuZWFyZXN0IHRvIGl0cyBhcmd1bWVudAorLkZhIHggLAorcm91bmRpbmcgYXdheSBmcm9tIHplcm8gaW4gaGFsZndheSBjYXNlcy4KK0lmIHRoZSByb3VuZGVkIHJlc3VsdCBpcyB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYQorLlZ0IGxvbmcKK3ZhbHVlLCBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgorT3RoZXJ3aXNlLCBpZgorLkZhIHgKK2lzIG5vdCBhbiBpbnRlZ2VyLAorLkZuIGxyb3VuZAorbWF5IHJhaXNlIGFuIGluZXhhY3QgZXhjZXB0aW9uLgorV2hlbiB0aGUgcm91bmRlZCByZXN1bHQgaXMgcmVwcmVzZW50YWJsZSBhcyBhCisuVnQgbG9uZyAsCit0aGUgZXhwcmVzc2lvbgorLkZuIGxyb3VuZCB4CitpcyBlcXVpdmFsZW50IHRvCisuUG8gVnQgbG9uZyBQYyBOcyBGbiByb3VuZCB4CisoYWx0aG91Z2ggdGhlIGZvcm1lciBtYXkgYmUgbW9yZSBlZmZpY2llbnQpLgorLlBwCitUaGUKKy5GbiBsbHJvdW5kICwKKy5GbiBsbHJvdW5kZiAsCisuRm4gbGxyb3VuZGwgLAorLkZuIGxyb3VuZGYKK2FuZAorLkZuIGxyb3VuZGwKK2Z1bmN0aW9ucyBkaWZmZXIgZnJvbQorLkZuIGxyb3VuZAorb25seSBpbiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzLgorLlNoIFNFRSBBTFNPCisuWHIgbHJpbnQgMyAsCisuWHIgbWF0aCAzICwKKy5YciByaW50IDMgLAorLlhyIHJvdW5kIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIGxscm91bmQgLAorLkZuIGxscm91bmRmICwKKy5GbiBsbHJvdW5kbCAsCisuRm4gbHJvdW5kICwKKy5GbiBscm91bmRmICwKK2FuZAorLkZuIGxyb3VuZGwKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZQorLlZ0IGZsb2F0CithbmQKKy5WdCBkb3VibGUKK3ZlcnNpb25zIG9mIHRoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS40IC4KK1RoZQorLlZ0ICJsb25nIGRvdWJsZSIKK3ZlcnNpb25zIGFwcGVhcmVkIGluCisuRnggNi4wIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL21hdGguMyBiL2xpYm0vbWFuL21hdGguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhiNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vbWF0aC4zCkBAIC0wLDAgKzEsMjQyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIJZnJvbTogQCgjKW1hdGguMwk2LjEwIChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbWF0aC4zLHYgMS4yNyAyMDA1LzExLzE3IDEzOjAwOjAwIHJ1IEV4cCAkCisuXCIKKy5EZCBOb3ZlbWJlciA2LCAyMDA1CisuRHQgTUFUSCAzCisuT3MKKy5pZiBuIFx7XAorLmNoYXIgXFtzcl0gInNxcnQKKy5cfQorLlNoIE5BTUUKKy5ObSBtYXRoCisuTmQgImZsb2F0aW5nLXBvaW50IG1hdGhlbWF0aWNhbCBsaWJyYXJ5IgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zIGNvbnN0aXR1dGUgdGhlIEMgbWF0aCBsaWJyYXJ5LgorLlNoICJMSVNUIE9GIEZVTkNUSU9OUyIKK0VhY2ggb2YgdGhlIGZvbGxvd2luZworLlZ0IGRvdWJsZQorZnVuY3Rpb25zIGhhcyBhCisuVnQgZmxvYXQKK2NvdW50ZXJwYXJ0IHdpdGggYW4KKy5RbCBmCithcHBlbmRlZCB0byB0aGUgbmFtZSBhbmQgYQorLlZ0ICJsb25nIGRvdWJsZSIKK2NvdW50ZXJwYXJ0IHdpdGggYW4KKy5RbCBsCithcHBlbmRlZC4KK0FzIGFuIGV4YW1wbGUsIHRoZQorLlZ0IGZsb2F0CithbmQKKy5WdCAibG9uZyBkb3VibGUiCitjb3VudGVycGFydHMgb2YKKy5GdCBkb3VibGUKKy5GbiBhY29zICJkb3VibGUgeCIKK2FyZQorLkZ0IGZsb2F0CisuRm4gYWNvc2YgImZsb2F0IHgiCithbmQKKy5GdCAibG9uZyBkb3VibGUiCisuRm4gYWNvc2wgImxvbmcgZG91YmxlIHgiICwKK3Jlc3BlY3RpdmVseS4KKy5kZSBDbAorLkJsIC1jb2x1bW4gImlzZ3JlYXRlcmVxdWFsIiAiYmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCBvZiB0aGUgb3JkZXIgMCIKKy5FbSAiTmFtZQlEZXNjcmlwdGlvbiIKKy4uCisuU3MgQWxnZWJyYWljIEZ1bmN0aW9ucworLkNsCitjYnJ0CWN1YmUgcm9vdAorZm1hCWZ1c2VkIG11bHRpcGx5LWFkZAoraHlwb3QJRXVjbGlkZWFuIGRpc3RhbmNlCitzcXJ0CXNxdWFyZSByb290CisuRWwKKy5TcyBDbGFzc2lmaWNhdGlvbiBGdW5jdGlvbnMKKy5DbAorZnBjbGFzc2lmeQljbGFzc2lmeSBhIGZsb2F0aW5nLXBvaW50IHZhbHVlCitpc2Zpbml0ZQlkZXRlcm1pbmUgd2hldGhlciBhIHZhbHVlIGlzIGZpbml0ZQoraXNpbmYJZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBpbmZpbml0ZQoraXNuYW4JZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBcKihOYQoraXNub3JtYWwJZGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBpcyBub3JtYWxpemVkCisuRWwKKy5TcyBFeHBvbmVudCBNYW5pcHVsYXRpb24gRnVuY3Rpb25zCisuQ2wKK2ZyZXhwCWV4dHJhY3QgZXhwb25lbnQgYW5kIG1hbnRpc3NhCitpbG9nYglleHRyYWN0IGV4cG9uZW50CitsZGV4cAltdWx0aXBseSBieSBwb3dlciBvZiAyCitsb2diCWV4dHJhY3QgZXhwb25lbnQKK3NjYWxibG4JYWRqdXN0IGV4cG9uZW50CitzY2FsYm4JYWRqdXN0IGV4cG9uZW50CisuRWwKKy5TcyBFeHRyZW11bS0gYW5kIFNpZ24tUmVsYXRlZCBGdW5jdGlvbnMKKy5DbAorY29weXNpZ24JY29weSBzaWduIGJpdAorZmFicwlhYnNvbHV0ZSB2YWx1ZQorZmRpbQlwb3NpdGl2ZSBkaWZmZXJlbmNlCitmbWF4CW1heGltdW0gZnVuY3Rpb24KK2ZtaW4JbWluaW11bSBmdW5jdGlvbgorc2lnbmJpdAlleHRyYWN0IHNpZ24gYml0CisuRWwKKy5cIiAuU3MgTm90IGEgTnVtYmVyCisuXCIgLkNsCisuXCIgbmFuCXJldHVybiBxdWlldCBcKihOYSkJMAorLlwiIC5FbAorLlNzIFJlc2lkdWUgYW5kIFJvdW5kaW5nIEZ1bmN0aW9ucworLkNsCitjZWlsCWludGVnZXIgbm8gbGVzcyB0aGFuCitmbG9vcglpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbgorZm1vZAlwb3NpdGl2ZSByZW1haW5kZXIKK2xscmludAlyb3VuZCB0byBpbnRlZ2VyIGluIGZpeGVkLXBvaW50IGZvcm1hdAorbGxyb3VuZAlyb3VuZCB0byBuZWFyZXN0IGludGVnZXIgaW4gZml4ZWQtcG9pbnQgZm9ybWF0CitscmludAlyb3VuZCB0byBpbnRlZ2VyIGluIGZpeGVkLXBvaW50IGZvcm1hdAorbHJvdW5kCXJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciBpbiBmaXhlZC1wb2ludCBmb3JtYXQKK21vZGYJZXh0cmFjdCBpbnRlZ2VyIGFuZCBmcmFjdGlvbmFsIHBhcnRzCituZWFyYnlpbnQJcm91bmQgdG8gaW50ZWdlciAoc2lsZW50KQorbmV4dGFmdGVyCW5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZQorbmV4dHRvd2FyZAluZXh0IHJlcHJlc2VudGFibGUgdmFsdWUKK3JlbWFpbmRlcglyZW1haW5kZXIKK3JlbXF1bwlyZW1haW5kZXIgd2l0aCBwYXJ0aWFsIHF1b3RpZW50CityaW50CXJvdW5kIHRvIGludGVnZXIKK3JvdW5kCXJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlcgordHJ1bmMJaW50ZWdlciBubyBncmVhdGVyIGluIG1hZ25pdHVkZSB0aGFuCisuRWwKKy5QcAorVGhlCisuRm4gY2VpbCAsCisuRm4gZmxvb3IgLAorLkZuIGxscm91bmQgLAorLkZuIGxyb3VuZCAsCisuRm4gcm91bmQgLAorYW5kCisuRm4gdHJ1bmMKK2Z1bmN0aW9ucyByb3VuZCBpbiBwcmVkZXRlcm1pbmVkIGRpcmVjdGlvbnMsIHdoZXJlYXMKKy5GbiBsbHJpbnQgLAorLkZuIGxyaW50ICwKK2FuZAorLkZuIHJpbnQKK3JvdW5kIGFjY29yZGluZyB0byB0aGUgY3VycmVudCAoZHluYW1pYykgcm91bmRpbmcgbW9kZS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBkeW5hbWljIHJvdW5kaW5nIG1vZGUsIHNlZQorLlhyIGZlbnYgMworYW5kCisuWHIgZmVzZXRyb3VuZCAzIC4KKy5TcyBTaWxlbnQgT3JkZXIgUHJlZGljYXRlcworLkNsCitpc2dyZWF0ZXIJZ3JlYXRlciB0aGFuIHJlbGF0aW9uCitpc2dyZWF0ZXJlcXVhbAlncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVsYXRpb24KK2lzbGVzcwlsZXNzIHRoYW4gcmVsYXRpb24KK2lzbGVzc2VxdWFsCWxlc3MgdGhhbiBvciBlcXVhbCB0byByZWxhdGlvbgoraXNsZXNzZ3JlYXRlcglsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHJlbGF0aW9uCitpc3Vub3JkZXJlZAl1bm9yZGVyZWQgcmVsYXRpb24KKy5FbAorLlNzIFRyYW5zY2VuZGVudGFsIEZ1bmN0aW9ucworLkNsCithY29zCWludmVyc2UgY29zaW5lCithY29zaAlpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lCithc2luCWludmVyc2Ugc2luZQorYXNpbmgJaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUKK2F0YW4JaW52ZXJzZSB0YW5nZW50CithdGFuaAlpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudAorYXRhbjIJYXRhbih5L3gpOyBjb21wbGV4IGFyZ3VtZW50Citjb3MJY29zaW5lCitjb3NoCWh5cGVyYm9saWMgY29zaW5lCitlcmYJZXJyb3IgZnVuY3Rpb24KK2VyZmMJY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbgorZXhwCWV4cG9uZW50aWFsIGJhc2UgZQorZXhwMglleHBvbmVudGlhbCBiYXNlIDIKK2V4cG0xCWV4cCh4KVwtMQorajAJQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIG9mIHRoZSBvcmRlciAwCitqMQlCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQgb2YgdGhlIG9yZGVyIDEKK2puCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZCBvZiB0aGUgb3JkZXIgbgorbGdhbW1hCWxvZyBnYW1tYSBmdW5jdGlvbgorbG9nCW5hdHVyYWwgbG9nYXJpdGhtCitsb2cxMAlsb2dhcml0aG0gdG8gYmFzZSAxMAorbG9nMXAJbG9nKDEreCkKKy5cIiBsb2cyCWJhc2UgMiBsb2dhcml0aG0KK3BvdwlleHBvbmVudGlhbCB4Kip5CitzaW4JdHJpZ29ub21ldHJpYyBmdW5jdGlvbgorc2luaAloeXBlcmJvbGljIGZ1bmN0aW9uCit0YW4JdHJpZ29ub21ldHJpYyBmdW5jdGlvbgordGFuaAloeXBlcmJvbGljIGZ1bmN0aW9uCit0Z2FtbWEJZ2FtbWEgZnVuY3Rpb24KK3kwCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIDAKK3kxCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIDEKK3luCUJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgb2YgdGhlIG9yZGVyIG4KKy5FbAorLlBwCitVbmxpa2UgdGhlIGFsZ2VicmFpYyBmdW5jdGlvbnMgbGlzdGVkIGVhcmxpZXIsIHRoZSByb3V0aW5lcworaW4gdGhpcyBzZWN0aW9uIG1heSBub3QgcHJvZHVjZSBhIHJlc3VsdCB0aGF0IGlzIGNvcnJlY3RseSByb3VuZGVkLAorc28gcmVwcm9kdWNpYmxlIHJlc3VsdHMgY2Fubm90IGJlIGd1YXJhbnRlZWQgYWNyb3NzIHBsYXRmb3Jtcy4KK0ZvciBtb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucywgaG93ZXZlciwgaW5jb3JyZWN0IHJvdW5kaW5nIG9jY3VycworcmFyZWx5LCBhbmQgdGhlbiBvbmx5IGluIHZlcnktY2xvc2UtdG8taGFsZndheSBjYXNlcy4KKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgaWVlZSAzCisuU2ggSElTVE9SWQorQSBtYXRoIGxpYnJhcnkgd2l0aCBtYW55IG9mIHRoZSBwcmVzZW50IGZ1bmN0aW9ucyBhcHBlYXJlZCBpbgorLkF0IHY3IC4KK1RoZSBsaWJyYXJ5IHdhcyBzdWJzdGFudGlhbGx5IHJld3JpdHRlbiBmb3IKKy5CeCA0LjMKK3RvIHByb3ZpZGUKK2JldHRlciBhY2N1cmFjeSBhbmQgc3BlZWQgb24gbWFjaGluZXMgc3VwcG9ydGluZyBlaXRoZXIgVkFYCitvciBJRUVFIDc1NCBmbG9hdGluZy1wb2ludC4KK01vc3Qgb2YgdGhpcyBsaWJyYXJ5IHdhcyByZXBsYWNlZCB3aXRoIEZETElCTSwgZGV2ZWxvcGVkIGF0IFN1bgorTWljcm9zeXN0ZW1zLCBpbgorLkZ4IDEuMS41IC4KK0FkZGl0aW9uYWwgcm91dGluZXMsIGluY2x1ZGluZyBvbmVzIGZvcgorLlZ0IGZsb2F0CithbmQKKy5WdCBsb25nIGRvdWJsZQordmFsdWVzLCB3ZXJlIHdyaXR0ZW4gZm9yIG9yIGltcG9ydGVkIGludG8gc3Vic2VxdWVudCB2ZXJzaW9ucyBvZiBGcmVlQlNELgorLlNoIEJVR1MKK1RoZQorLkZuIGxvZzIKK2FuZAorLkZuIG5hbgorZnVuY3Rpb25zIGFyZSBtaXNzaW5nLCBhbmQgbWFueSBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlaXIKKy5WdCAibG9uZyBkb3VibGUiCit2YXJpYW50cy4KKy5QcAorTWFueSBvZiB0aGUgcm91dGluZXMgdG8gY29tcHV0ZSB0cmFuc2NlbmRlbnRhbCBmdW5jdGlvbnMgcHJvZHVjZQoraW5hY2N1cmF0ZSByZXN1bHRzIGluIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgcm91bmRpbmcgbW9kZS4KKy5QcAorT24gc29tZSBhcmNoaXRlY3R1cmVzLCB0cmlnb25vbWV0cmljIGFyZ3VtZW50IHJlZHVjdGlvbiBpcyBub3QKK3BlcmZvcm1lZCBhY2N1cmF0ZWx5LCByZXN1bHRpbmcgaW4gZXJyb3JzIGdyZWF0ZXIgdGhhbiAxCisuRW0gdWxwCitmb3IgbGFyZ2UgYXJndW1lbnRzIHRvCisuRm4gY29zICwKKy5GbiBzaW4gLAorYW5kCisuRm4gdGFuIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL25leHRhZnRlci4zIGIvbGlibS9tYW4vbmV4dGFmdGVyLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NGZiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL25leHRhZnRlci4zCkBAIC0wLDAgKzEsMTAwIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vbmV4dGFmdGVyLjMsdiAxLjIgMjAwNS8wMy8wNyAwNTowMDoyOSBkYXMgRXhwICQKKy5cIgorLkRkIE1heSA0LCAyMDA1CisuRHQgTkVYVEFGVEVSIDMKKy5PcworLlNoIE5BTUUKKy5ObSBuZXh0YWZ0ZXIgLAorLk5tIG5leHRhZnRlcmYgLAorLk5tIG5leHRhZnRlcmwgLAorLk5tIG5leHR0b3dhcmQgLAorLk5tIG5leHR0b3dhcmRmICwKKy5ObSBuZXh0dG93YXJkbAorLk5kIG5leHQgcmVwcmVzZW50YWJsZSB2YWx1ZQorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBuZXh0YWZ0ZXIgImRvdWJsZSB4IiAiZG91YmxlIHkiCisuRnQgZmxvYXQKKy5GbiBuZXh0YWZ0ZXJmICJmbG9hdCB4IiAiZmxvYXQgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIG5leHRhZnRlcmwgImxvbmcgZG91YmxlIHgiICJsb25nIGRvdWJsZSB5IgorLkZ0IGRvdWJsZQorLkZuIG5leHR0b3dhcmQgImRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5GdCBmbG9hdAorLkZuIG5leHR0b3dhcmRmICJmbG9hdCB4IiAibG9uZyBkb3VibGUgeSIKKy5GdCBsb25nIGRvdWJsZQorLkZuIG5leHR0b3dhcmRsICJsb25nIGRvdWJsZSB4IiAibG9uZyBkb3VibGUgeSIKKy5TaCBERVNDUklQVElPTgorVGhlc2UgZnVuY3Rpb25zCityZXR1cm4gdGhlIG5leHQgbWFjaGluZSByZXByZXNlbnRhYmxlIG51bWJlciBmcm9tCisuRmEgeAoraW4gZGlyZWN0aW9uCisuRmEgeSAuCisuU2ggU0VFIEFMU08KKy5YciBpZWVlIDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gbmV4dGFmdGVyICwKKy5GbiBuZXh0YWZ0ZXJmICwKKy5GbiBuZXh0YWZ0ZXJsICwKKy5GbiBuZXh0dG93YXJkICwKKy5GbiBuZXh0dG93YXJkZiAsCithbmQKKy5GbiBuZXh0dG93YXJkbAorcm91dGluZXMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KK1RoZXkgaW1wbGVtZW50IHRoZSBOZXh0YWZ0ZXIgZnVuY3Rpb24gcmVjb21tZW5kZWQgYnkKKy5TdCAtaWVlZTc1NCAsCit3aXRoIHRoZSBleHRlbnNpb24gdGhhdAorLkZuIG5leHRhZnRlciArMC4wLCAtMC4wCityZXR1cm5zCisuTGkgLTAuMCAsCithbmQKKy5GbiBuZXh0YWZ0ZXIgLTAuMCwgKzAuMAorcmV0dXJucworLkxpICswLjAgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIG5leHRhZnRlcgorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5CeCA0LjMgLAorYW5kCisuRm4gbmV4dGFmdGVyZgorYXBwZWFyZWQgaW4KKy5GeCAyLjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vcmVtYWluZGVyLjMgYi9saWJtL21hbi9yZW1haW5kZXIuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYyMWUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vcmVtYWluZGVyLjMKQEAgLTAsMCArMSwxNDYgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKWllZWUuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9yZW1haW5kZXIuMyx2IDEuNCAyMDA1LzExLzI0IDA5OjI1OjEwIGpvZWwgRXhwICQKKy5cIgorLkRkIE1hcmNoIDI0LCAyMDA1CisuRHQgUkVNQUlOREVSIDMKKy5PcworLlNoIE5BTUUKKy5ObSByZW1haW5kZXIgLAorLk5tIHJlbWFpbmRlcmYgLAorLk5tIHJlbXF1byAsCisuTm0gcmVtcXVvZgorLk5kIG1pbmltYWwgcmVzaWR1ZSBmdW5jdGlvbnMKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gcmVtYWluZGVyICJkb3VibGUgeCIgImRvdWJsZSB5IgorLkZ0IGZsb2F0CisuRm4gcmVtYWluZGVyZiAiZmxvYXQgeCIgImZsb2F0IHkiCisuRnQgZG91YmxlCisuRm4gcmVtcXVvICJkb3VibGUgeCIgImRvdWJsZSB5IiAiaW50ICpxdW8iCisuRnQgZmxvYXQKKy5GbiByZW1xdW9mICJmbG9hdCB4IiAiZmxvYXQgeSIgImludCAqcXVvIgorLlNoIERFU0NSSVBUSU9OCisuRm4gcmVtYWluZGVyICwKKy5GbiByZW1haW5kZXJmICwKKy5GbiByZW1xdW8gLAorYW5kCisuRm4gcmVtcXVvZgorcmV0dXJuIHRoZSByZW1haW5kZXIKKy5GYSByCis6PQorLkZhIHgKK1wtCisuRmEgblwoKip5Cit3aGVyZQorLkZhIG4KK2lzIHRoZSBpbnRlZ2VyIG5lYXJlc3QgdGhlIGV4YWN0IHZhbHVlIG9mCisuQmsgLXdvcmRzCisuRmEgeCBOcyAvIE5zIEZhIHkgOworLkVrCittb3Jlb3ZlciBpZgorLlBmIFxcKihCYSBGYSBuCitcLQorLlNtIG9mZgorLkZhIHggTm8gLyBGYSB5IE5vIFxcKihCYQorLlNtIG9uCis9CisxLzIKK3RoZW4KKy5GYSBuCitpcyBldmVuLgorQ29uc2VxdWVudGx5Cit0aGUgcmVtYWluZGVyIGlzIGNvbXB1dGVkIGV4YWN0bHkgYW5kCisuU20gb2ZmCisuUGYgXFwqKEJhIEZhIHIgTm8gXFwqKEJhCisuU20gb24KK1wqKExlCisuU20gb2ZmCisuUGYgXFwqKEJhIEZhIHkgTm8gXFwqKEJhLzIgLgorLlNtIG9uCitCdXQgYXR0ZW1wdGluZyB0byB0YWtlIHRoZSByZW1haW5kZXIgd2hlbgorLkZhIHkKK2lzIDAgb3IKKy5GYSB4CitpcyBcKihQbVwqKElmIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYSBcKihOYS4KKy5QcAorVGhlCisuRm4gcmVtcXVvCithbmQKKy5GbiByZW1xdW9mCitmdW5jdGlvbnMgYWxzbyBzdG9yZSB0aGUgbGFzdAorLlZhIGsKK2JpdHMgb2YKKy5GYSBuCitpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorLkZhIHF1byAsCitwcm92aWRlZCB0aGF0CisuRmEgbgorZXhpc3RzLgorVGhlIG51bWJlciBvZiBiaXRzCisuVmEgaworaXMgcGxhdGZvcm0tc3BlY2lmaWMsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IDMuCisuU2ggU0VFIEFMU08KKy5YciBmbW9kIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiByZW1haW5kZXIgLAorLkZuIHJlbWFpbmRlcmYgLAorLkZuIHJlbXF1byAsCithbmQKKy5GbiByZW1xdW9mCityb3V0aW5lcyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorVGhlIHJlbWFpbmRlciBpcyBhcyBkZWZpbmVkIGluCisuU3QgLWllZWU3NTQgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIHJlbWFpbmRlcgorYW5kCisuRm4gcmVtYWluZGVyZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zCithbmQKKy5GeCAyLjAgLAorcmVzcGVjdGl2ZWx5LgorVGhlCisuRm4gcmVtcXVvCithbmQKKy5GbiByZW1xdW9mCitmdW5jdGlvbnMgd2VyZSBhZGRlZCBpbgorLkZ4IDYuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9yaW50LjMgYi9saWJtL21hbi9yaW50LjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NWZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL3JpbnQuMwpAQCAtMCwwICsxLDEwMyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk4NSwgMTk5MSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpcmludC4zCTUuMSAoQmVya2VsZXkpIDUvMi85MQorLlwiICRGcmVlQlNEOiBzcmMvbGliL21zdW4vbWFuL3JpbnQuMyx2IDEuMTEgMjAwNS8wMS8xMSAyMzoxMjoxNyBkYXMgRXhwICQKKy5cIgorLkRkIEp1bHkgNSwgMjAwNAorLkR0IFJJTlQgMworLk9zCisuU2ggTkFNRQorLk5tIG5lYXJieWludCAsCisuTm0gbmVhcmJ5aW50ZiAsCisuTm0gcmludCAsCisuTm0gcmludGYKKy5OZCByb3VuZCB0byBpbnRlZ3JhbCB2YWx1ZSBpbiBmbG9hdGluZy1wb2ludCBmb3JtYXQKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gbmVhcmJ5aW50ICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIG5lYXJieWludGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gcmludCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiByaW50ZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gcmludAorYW5kIHRoZQorLkZuIHJpbnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBpbnRlZ3JhbCB2YWx1ZSBuZWFyZXN0IHRvCisuRmEgeAorYWNjb3JkaW5nIHRvIHRoZSBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuCitUaGVzZSBmdW5jdGlvbnMgcmFpc2UgYW4gaW5leGFjdCBleGNlcHRpb24gd2hlbiB0aGUgb3JpZ2luYWwgYXJndW1lbnQKK2lzIG5vdCBhbiBleGFjdCBpbnRlZ2VyLgorLlBwCitUaGUKKy5GbiBuZWFyYnlpbnQKK2FuZAorLkZuIG5lYXJieWludGYKK2Z1bmN0aW9ucyBwZXJmb3JtIHRoZSBzYW1lIG9wZXJhdGlvbiwgZXhjZXB0IHRoYXQgdGhleSBkbyBub3QgcmFpc2UKK2FuIGluZXhhY3QgZXhjZXB0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgYWJzIDMgLAorLlhyIGNlaWwgMyAsCisuWHIgZmFicyAzICwKKy5YciBmZW52IDMgLAorLlhyIGZsb29yIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbHJpbnQgMyAsCisuWHIgbHJvdW5kIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcm91bmQgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gbmVhcmJ5aW50ICwKKy5GbiBuZWFyYnlpbnRmICwKKy5GbiByaW50ICwKK2FuZAorLkZuIHJpbnRmCitmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitBCisuRm4gcmludAorZnVuY3Rpb24gYXBwZWFyZWQgaW4KKy5BdCB2NiAuCitUaGUKKy5GbiBuZWFyYnlpbnQKK2FuZAorLkZuIG5lYXJieWludGYKK2Z1bmN0aW9ucyBhcHBlYXJlZCBpbgorLkZ4IDUuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9yb3VuZC4zIGIvbGlibS9tYW4vcm91bmQuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc3ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vcm91bmQuMwpAQCAtMCwwICsxLDgwIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9yb3VuZC4zLHYgMS42IDIwMDUvMDYvMTUgMTk6MDQ6MDQgcnUgRXhwICQKKy5cIgorLkRkIEFwcmlsIDcsIDIwMDUKKy5EdCBST1VORCAzCisuT3MKKy5TaCBOQU1FCisuTm0gcm91bmQgLAorLk5tIHJvdW5kZiAsCisuTm0gcm91bmRsCisuTmQgcm91bmQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZQorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiByb3VuZCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiByb3VuZGYgImZsb2F0IHgiCisuRnQgImxvbmcgZG91YmxlIgorLkZuIHJvdW5kbCAibG9uZyBkb3VibGUgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gcm91bmQgLAorLkZuIHJvdW5kZiAsCithbmQKKy5GbiByb3VuZGwKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgdG8KKy5GYSB4IDsKK2lmCisuRmEgeAorbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvIGludGVncmFsIHZhbHVlcywgdGhlbiB0aGVzZQorZnVuY3Rpb25zIHJldHVybiB0aGUgaW50ZWdyYWwgdmFsdWUgd2l0aCB0aGUgbGFyZ2VyCithYnNvbHV0ZSB2YWx1ZSAoaS5lLiwgdGhleSByb3VuZCBhd2F5IGZyb20gemVybykuCisuU2ggU0VFIEFMU08KKy5YciBjZWlsIDMgLAorLlhyIGZsb29yIDMgLAorLlhyIGllZWUgMyAsCisuWHIgbHJpbnQgMyAsCisuWHIgbHJvdW5kIDMgLAorLlhyIG1hdGggMyAsCisuWHIgcmludCAzICwKKy5YciB0cnVuYyAzCisuU2ggU1RBTkRBUkRTCitUaGVzZSBmdW5jdGlvbnMgY29uZm9ybSB0bworLlN0IC1pc29DLTk5IC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiByb3VuZAorYW5kCisuRm4gcm91bmRmCitmdW5jdGlvbnMgYXBwZWFyZWQgaW4KKy5GeCA1LjMgLgorVGhlCisuRm4gcm91bmRsCitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkZ4IDYuMCAuCmRpZmYgLS1naXQgYS9saWJtL21hbi9zY2FsYm4uMyBiL2xpYm0vbWFuL3NjYWxibi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2NhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zY2FsYm4uMwpAQCAtMCwwICsxLDk1IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgICAgIGZyb206IEAoIylpZWVlLjMJNi40IChCZXJrZWxleSkgNS82LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vc2NhbGJuLjMsdiAxLjMgMjAwNS8xMS8yNCAwOToyNToxMCBqb2VsIEV4cCAkCisuXCIKKy5EZCBNYXJjaCA0LCAyMDA1CisuRHQgU0NBTEJOIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzY2FsYmxuICwKKy5ObSBzY2FsYmxuZiAsCisuTm0gc2NhbGJsbmwgLAorLk5tIHNjYWxibiAsCisuTm0gc2NhbGJuZiAsCisuTm0gc2NhbGJubAorLk5kIGFkanVzdCBleHBvbmVudAorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBzY2FsYmxuICJkb3VibGUgeCIgImxvbmcgbiIKKy5GdCBmbG9hdAorLkZuIHNjYWxibG5mICJmbG9hdCB4IiAibG9uZyBuIgorLkZ0IGxvbmcgZG91YmxlCisuRm4gc2NhbGJsbmwgImxvbmcgZG91YmxlIHgiICJsb25nIG4iCisuRnQgZG91YmxlCisuRm4gc2NhbGJuICJkb3VibGUgeCIgImludCBuIgorLkZ0IGZsb2F0CisuRm4gc2NhbGJuZiAiZmxvYXQgeCIgImludCBuIgorLkZ0IGxvbmcgZG91YmxlCisuRm4gc2NhbGJubCAibG9uZyBkb3VibGUgeCIgImludCBuIgorLlNoIERFU0NSSVBUSU9OCitUaGVzZSByb3V0aW5lcyByZXR1cm4KKy5GYSB4IE5zIFwoKiooMioqIE5zIEZhIG4gKQorY29tcHV0ZWQgYnkgZXhwb25lbnQgbWFuaXB1bGF0aW9uLgorLlNoIFNFRSBBTFNPCisuWHIgaWVlZSAzICwKKy5YciBtYXRoIDMKKy5TaCBTVEFOREFSRFMKK1RoZXNlIHJvdXRpbmVzIGNvbmZvcm0gdG8KKy5TdCAtaXNvQy05OSAsCithbmQgdGhleSBpbXBsZW1lbnQgdGhlIFNjYWxiIGZ1bmN0aW9uIHJlY29tbWVuZGVkIGJ5CisuU3QgLWllZWU3NTQgLgorLlNoIEhJU1RPUlkKK1RoZQorLkZuIHNjYWxibgorYW5kCisuRm4gc2NhbGJuZgorZnVuY3Rpb25zIGFwcGVhcmVkIGluCisuQnggNC4zCithbmQKKy5GeCAyLjAgLAorcmVzcGVjdGl2ZWx5LgorVGhlCisuRm4gc2NhbGJsbgorYW5kCisuRm4gc2NhbGJsbmYKK2Z1bmN0aW9ucyBmaXJzdCBhcHBlYXJlZCBpbgorLkZ4IDUuMyAsCithbmQKKy5GbiBzY2FsYmxubAorYW5kCisuRm4gc2NhbGJsbgoraW4KKy5GeCA2LjAgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vc2lnbmJpdC4zIGIvbGlibS9tYW4vc2lnbmJpdC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDk2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zaWduYml0LjMKQEAgLTAsMCArMSw1NyBAQAorLlwiIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zaWduYml0LjMsdiAxLjEgMjAwNC8wNy8xOSAwODoxNjoxMCBkYXMgRXhwICQKKy5cIgorLkRkIEp1bHkgMTgsIDIwMDQKKy5EdCBTSUdOQklUIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzaWduYml0CisuTmQgImRldGVybWluZSB3aGV0aGVyIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyJ3Mgc2lnbiBpcyBuZWdhdGl2ZSIKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgaW50CisuRm4gc2lnbmJpdCAicmVhbC1mbG9hdGluZyB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaWduYml0CittYWNybyB0YWtlcyBhbiBhcmd1bWVudCBvZgorLkZhIHgKK2FuZCByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBvZiBpdHMgc2lnbiBpcyBuZWdhdGl2ZSwgb3RoZXJ3aXNlIDAuCisuU2ggU0VFIEFMU08KKy5YciBmcGNsYXNzaWZ5IDMgLAorLlhyIG1hdGggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gc2lnbmJpdAorbWFjcm8gY29uZm9ybXMgdG8KKy5TdCAtaXNvQy05OSAuCisuU2ggSElTVE9SWQorVGhlCisuRm4gc2lnbmJpdAorbWFjcm8gd2FzIGFkZGVkIGluCisuRnggNS4xIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL3Npbi4zIGIvbGlibS9tYW4vc2luLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0MDhhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vbWFuL3Npbi4zCkBAIC0wLDAgKzEsODIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIJQCgjKXNpbi4zCTYuNyAoQmVya2VsZXkpIDQvMTkvOTEKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXNpbi4zCTYuNyAoQmVya2VsZXkpIDQvMTkvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zaW4uMyx2IDEuOSAyMDAxLzEwLzEzIDEyOjIzOjIzIGJkZSBFeHAgJAorLlwiCisuRGQgQXByaWwgMTksIDE5OTEKKy5EdCBTSU4gMworLk9zCisuU2ggTkFNRQorLk5tIHNpbiAsCisuTm0gc2luZgorLk5kIHNpbmUgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIHNpbiAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzaW5mICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaW4KK2FuZCB0aGUKKy5GbiBzaW5mCitmdW5jdGlvbnMgY29tcHV0ZSB0aGUgc2luZSBvZgorLkZhIHgKKyhtZWFzdXJlZCBpbiByYWRpYW5zKS4KK0EgbGFyZ2UgbWFnbml0dWRlIGFyZ3VtZW50IG1heSB5aWVsZCBhIHJlc3VsdCB3aXRoIGxpdHRsZQorb3Igbm8gc2lnbmlmaWNhbmNlLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHNpbgorYW5kIHRoZQorLkZuIHNpbmYKK2Z1bmN0aW9ucyByZXR1cm4gdGhlIHNpbmUgdmFsdWUuCisuU2ggU0VFIEFMU08KKy5YciBhY29zIDMgLAorLlhyIGFzaW4gMyAsCisuWHIgYXRhbiAzICwKKy5YciBhdGFuMiAzICwKKy5YciBjb3MgMyAsCisuWHIgY29zaCAzICwKKy5YciBtYXRoIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuIDMgLAorLlhyIHRhbmggMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gc2luCitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KZGlmZiAtLWdpdCBhL2xpYm0vbWFuL3NpbmguMyBiL2xpYm0vbWFuL3NpbmguMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3ODYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vc2luaC4zCkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorLlwiICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisuXCIJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisuXCIgNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKy5cIiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy5cIiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisuXCIgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisuXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKy5cIiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIJZnJvbTogQCgjKXNpbmguMwk2LjYgKEJlcmtlbGV5KSA0LzE5LzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vc2luaC4zLHYgMS4xMiAyMDA1LzAxLzE0IDIzOjI4OjI4IGRhcyBFeHAgJAorLkRkIEphbnVhcnkgMTQsIDIwMDUKKy5EdCBTSU5IIDMKKy5PcworLlNoIE5BTUUKKy5ObSBzaW5oICwKKy5ObSBzaW5oZgorLk5kIGh5cGVyYm9saWMgc2luZSBmdW5jdGlvbgorLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiBzaW5oICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHNpbmhmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiBzaW5oCithbmQgdGhlCisuRm4gc2luaGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YKKy5GYSB4IC4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3MgMyAsCisuWHIgYXNpbiAzICwKKy5YciBhdGFuIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHRhbiAzICwKKy5YciB0YW5oIDMKKy5TaCBTVEFOREFSRFMKK1RoZQorLkZuIHNpbmgKK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vc3FydC4zIGIvbGlibS9tYW4vc3FydC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjhiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi9zcXJ0LjMKQEAgLTAsMCArMSwxMDAgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXNxcnQuMwk2LjQgKEJlcmtlbGV5KSA1LzYvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi9zcXJ0LjMsdiAxLjEyIDIwMDUvMDEvMTQgMjM6Mjg6MjggZGFzIEV4cCAkCisuXCIKKy5EZCBNYXkgNiwgMTk5MQorLkR0IFNRUlQgMworLk9zCisuU2ggTkFNRQorLk5tIGNicnQgLAorLk5tIGNicnRmICwKKy5ObSBzcXJ0ICwKKy5ObSBzcXJ0ZgorLk5kIGN1YmUgcm9vdCBhbmQgc3F1YXJlIHJvb3QgZnVuY3Rpb25zCisuU2ggTElCUkFSWQorLkxiIGxpYm0KKy5TaCBTWU5PUFNJUworLkluIG1hdGguaAorLkZ0IGRvdWJsZQorLkZuIGNicnQgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gY2JydGYgImZsb2F0IHgiCisuRnQgZG91YmxlCisuRm4gc3FydCAiZG91YmxlIHgiCisuRnQgZmxvYXQKKy5GbiBzcXJ0ZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gY2JydAorYW5kIHRoZQorLkZuIGNicnRmCitmdW5jdGlvbnMgY29tcHV0ZQordGhlIGN1YmUgcm9vdCBvZgorLkFyIHggLgorLlBwCitUaGUKKy5GbiBzcXJ0CithbmQgdGhlCisuRm4gc3FydGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZQorbm9uLW5lZ2F0aXZlIHNxdWFyZSByb290IG9mIHguCisuU2ggUkVUVVJOIFZBTFVFUworVGhlCisuRm4gY2JydAorYW5kIHRoZQorLkZuIGNicnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgY3ViZSByb290LgorVGhlCisuRm4gc3FydAorYW5kIHRoZQorLkZuIHNxcnRmCitmdW5jdGlvbnMgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgc3F1YXJlIHJvb3QKK3VubGVzcyBhbiBlcnJvciBvY2N1cnMuCitBbiBhdHRlbXB0IHRvIHRha2UgdGhlCisuRm4gc3FydAorb2YgbmVnYXRpdmUKKy5GYSB4CityYWlzZXMgYW4gaW52YWxpZCBleGNlcHRpb24gYW5kIGNhdXNlcyBhbiBcKihOYSB0byBiZSByZXR1cm5lZC4KKy5TaCBTRUUgQUxTTworLlhyIGZlbnYgMyAsCisuWHIgbWF0aCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiBzcXJ0CitmdW5jdGlvbiBjb25mb3JtcyB0bworLlN0IC1pc29DIC4KKy5TaCBISVNUT1JZCitUaGUKKy5GbiBjYnJ0CitmdW5jdGlvbiBhcHBlYXJlZCBpbgorLkJ4IDQuMyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi90YW4uMyBiL2xpYm0vbWFuL3Rhbi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi90YW4uMwpAQCAtMCwwICsxLDgxIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy5cIiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLlwiCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLlwiIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICAgICBmcm9tOiBAKCMpdGFuLjMJNS4xIChCZXJrZWxleSkgNS8yLzkxCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vdGFuLjMsdiAxLjkgMjAwMS8xMC8xMyAxMjoyMzoyMyBiZGUgRXhwICQKKy5cIgorLkRkIE1heSAyLCAxOTkxCisuRHQgVEFOIDMKKy5PcworLlNoIE5BTUUKKy5ObSB0YW4gLAorLk5tIHRhbmYKKy5OZCB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiB0YW4gImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gdGFuZiAiZmxvYXQgeCIKKy5TaCBERVNDUklQVElPTgorVGhlCisuRm4gdGFuCithbmQgdGhlCisuRm4gdGFuZgorZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHRhbmdlbnQgb2YKKy5GYSB4CisobWVhc3VyZWQgaW4gcmFkaWFucykuCitBIGxhcmdlIG1hZ25pdHVkZSBhcmd1bWVudCBtYXkgeWllbGQgYSByZXN1bHQKK3dpdGggbGl0dGxlIG9yIG5vIHNpZ25pZmljYW5jZS4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHRhbgorZnVuY3Rpb24gcmV0dXJucyB0aGUgdGFuZ2VudCB2YWx1ZS4KKy5TaCBTRUUgQUxTTworLlhyIGFjb3MgMyAsCisuWHIgYXNpbiAzICwKKy5YciBhdGFuIDMgLAorLlhyIGF0YW4yIDMgLAorLlhyIGNvcyAzICwKKy5YciBjb3NoIDMgLAorLlhyIG1hdGggMyAsCisuWHIgc2luIDMgLAorLlhyIHNpbmggMyAsCisuWHIgdGFuaCAzCisuU2ggU1RBTkRBUkRTCitUaGUKKy5GbiB0YW4KK2Z1bmN0aW9uIGNvbmZvcm1zIHRvCisuU3QgLWlzb0MgLgpkaWZmIC0tZ2l0IGEvbGlibS9tYW4vdGFuaC4zIGIvbGlibS9tYW4vdGFuaC4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWJjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL21hbi90YW5oLjMKQEAgLTAsMCArMSw4MCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy5cIiBhcmUgbWV0OgorLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLlwiICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisuXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisuXCIgICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy5cIglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKy5cIiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgZnJvbTogQCgjKXRhbmguMwk1LjEgKEJlcmtlbGV5KSA1LzIvOTEKKy5cIiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL21hbi90YW5oLjMsdiAxLjEwIDIwMDEvMTAvMTMgMTI6MjM6MjMgYmRlIEV4cCAkCisuXCIKKy5EZCBNYXkgMiwgMTk5MQorLkR0IFRBTkggMworLk9zCisuU2ggTkFNRQorLk5tIHRhbmggLAorLk5tIHRhbmhmCisuTmQgaHlwZXJib2xpYyB0YW5nZW50IGZ1bmN0aW9ucworLlNoIExJQlJBUlkKKy5MYiBsaWJtCisuU2ggU1lOT1BTSVMKKy5JbiBtYXRoLmgKKy5GdCBkb3VibGUKKy5GbiB0YW5oICJkb3VibGUgeCIKKy5GdCBmbG9hdAorLkZuIHRhbmhmICJmbG9hdCB4IgorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5GbiB0YW5oCithbmQgdGhlCisuRm4gdGFuaGYKK2Z1bmN0aW9ucyBjb21wdXRlIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YKKy5GYSB4IC4KK0ZvciBhIGRpc2N1c3Npb24gb2YgZXJyb3IgZHVlIHRvIHJvdW5kb2ZmLCBzZWUKKy5YciBtYXRoIDMgLgorLlNoIFJFVFVSTiBWQUxVRVMKK1RoZQorLkZuIHRhbmgKK2FuZCB0aGUKKy5GbiB0YW5oZgorZnVuY3Rpb25zIHJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IHZhbHVlLgorLlNoIFNFRSBBTFNPCisuWHIgYWNvcyAzICwKKy5YciBhc2luIDMgLAorLlhyIGF0YW4gMyAsCisuWHIgYXRhbjIgMyAsCisuWHIgY29zIDMgLAorLlhyIGNvc2ggMyAsCisuWHIgbWF0aCAzICwKKy5YciBzaW4gMyAsCisuWHIgc2luaCAzICwKKy5YciB0YW4gMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gdGFuaAorZnVuY3Rpb24gY29uZm9ybXMgdG8KKy5TdCAtaXNvQyAuCmRpZmYgLS1naXQgYS9saWJtL21hbi90cnVuYy4zIGIvbGlibS9tYW4vdHJ1bmMuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZjMjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9tYW4vdHJ1bmMuMwpAQCAtMCwwICsxLDgwIEBACisuXCIgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELm9yZz4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy5cIiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLlwiIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisuXCIgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisuXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy5cIiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisuXCIgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLlwiIFNVQ0ggREFNQUdFLgorLlwiCisuXCIgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9tYW4vdHJ1bmMuMyx2IDEuMyAyMDA1LzA2LzE1IDE5OjA0OjA0IHJ1IEV4cCAkCisuXCIKKy5EZCBBcHJpbCAxNiwgMjAwNQorLkR0IFRSVU5DIDMKKy5PcworLlNoIE5BTUUKKy5ObSB0cnVuYyAsCisuTm0gdHJ1bmNmICwKKy5ObSB0cnVuY2wKKy5OZCBuZWFyZXN0IGludGVncmFsIHZhbHVlIHdpdGggbWFnbml0dWRlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8eHwKKy5TaCBMSUJSQVJZCisuTGIgbGlibQorLlNoIFNZTk9QU0lTCisuSW4gbWF0aC5oCisuRnQgZG91YmxlCisuRm4gdHJ1bmMgImRvdWJsZSB4IgorLkZ0IGZsb2F0CisuRm4gdHJ1bmNmICJmbG9hdCB4IgorLkZ0ICJsb25nIGRvdWJsZSIKKy5GbiB0cnVuY2wgImxvbmcgZG91YmxlIHgiCisuU2ggREVTQ1JJUFRJT04KK1RoZQorLkZuIHRydW5jICwKKy5GbiB0cnVuY2YgLAorYW5kCisuRm4gdHJ1bmNsCitmdW5jdGlvbnMgcmV0dXJuIHRoZSBuZWFyZXN0IGludGVncmFsIHZhbHVlIHdpdGggbWFnbml0dWRlIGxlc3MgdGhhbgorb3IgZXF1YWwgdG8KKy5QZiB8IEZhIHggTnMgfCAuCitUaGV5IGFyZSBlcXVpdmFsZW50IHRvCisuRm4gcmludCAsCisuRm4gcmludGYgLAorYW5kCisuRm4gcmludGwgLAorcmVzcGVjdGl2ZWx5LCBpbiB0aGUKKy5EdiBGRV9UT1dBUkRaRVJPCityb3VuZGluZyBtb2RlLgorLlNoIFNFRSBBTFNPCisuWHIgY2VpbCAzICwKKy5YciBmZXNldHJvdW5kIDMgLAorLlhyIGZsb29yIDMgLAorLlhyIG1hdGggMyAsCisuWHIgbmV4dGFmdGVyIDMgLAorLlhyIHJpbnQgMyAsCisuWHIgcm91bmQgMworLlNoIFNUQU5EQVJEUworVGhlCisuRm4gdHJ1bmMgLAorLkZuIHRydW5jZiAsCithbmQKKy5GbiB0cnVuY2wKK2Z1bmN0aW9ucyBjb25mb3JtIHRvCisuU3QgLWlzb0MtOTkgLgorLlNoIEhJU1RPUlkKK1RoZXNlIHJvdXRpbmVzIGZpcnN0IGFwcGVhcmVkIGluCisuRnggNS4zIC4KZGlmZiAtLWdpdCBhL2xpYm0vcG93ZXJwYy9NYWtlZmlsZS5pbmMgYi9saWJtL3Bvd2VycGMvTWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjM3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3Bvd2VycGMvTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsMyBAQAorIyAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3Bvd2VycGMvTWFrZWZpbGUuaW5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTM6MzYgZGFzIEV4cCAkCisKK0xEQkxfUFJFQyA9IDUzCmRpZmYgLS1naXQgYS9saWJtL3Bvd2VycGMvX2ZwbWF0aC5oIGIvbGlibS9wb3dlcnBjL19mcG1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg1Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9wb3dlcnBjL19mcG1hdGguaApAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmMvcG93ZXJwYy9fZnBtYXRoLmgsdiAxLjcgMjAwNS8wMy8wNyAwNDo1NToyMiBkYXMgRXhwICQKKyAqLworCit1bmlvbiBJRUVFbDJiaXRzIHsKKwlsb25nIGRvdWJsZQllOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludAkJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CQlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJCW1hbmgJOjIwOworCQl1bnNpZ25lZCBpbnQJCW1hbmwJOjMyOworCX0gYml0czsKK307CisKKyNkZWZpbmUJbWFza19uYml0X2wodSkJKCh2b2lkKTApCisjZGVmaW5lCUxEQkxfSU1QTElDSVRfTkJJVAorI2RlZmluZQlMREJMX05CSVQJMAorCisjZGVmaW5lCUxEQkxfTUFOSF9TSVpFCTIwCisjZGVmaW5lCUxEQkxfTUFOTF9TSVpFCTMyCisKKyNkZWZpbmUJTERCTF9UT19BUlJBWTMyKHUsIGEpIGRvIHsJCQlcCisJKGEpWzBdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmw7CQlcCisJKGEpWzFdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCit9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9saWJtL3Bvd2VycGMvZmVudi5jIGIvbGlibS9wb3dlcnBjL2ZlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhODdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9wb3dlcnBjL2ZlbnYuYwpAQCAtMCwwICsxLDMxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vcG93ZXJwYy9mZW52LmMsdiAxLjEgMjAwNC8wNi8wNiAxMDowNToxMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorCitjb25zdCBmZW52X3QgX19mZV9kZmxfZW52ID0gMHgwMDAwMDAwMDsKZGlmZiAtLWdpdCBhL2xpYm0vcG93ZXJwYy9mZW52LmggYi9saWJtL3Bvd2VycGMvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDIzODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3Bvd2VycGMvZmVudi5oCkBAIC0wLDAgKzEsMjYzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9wb3dlcnBjL2ZlbnYuaCx2IDEuMyAyMDA1LzAzLzE2IDE5OjAzOjQ1IGRhcyBFeHAgJAorICovCisKKyNpZm5kZWYJX0ZFTlZfSF8KKyNkZWZpbmUJX0ZFTlZfSF8KKworI2luY2x1ZGUgPHN5cy9fdHlwZXMuaD4KKwordHlwZWRlZglfX3VpbnQzMl90CWZlbnZfdDsKK3R5cGVkZWYJX191aW50MzJfdAlmZXhjZXB0X3Q7CisKKy8qIEV4Y2VwdGlvbiBmbGFncyAqLworI2RlZmluZQlGRV9JTkVYQUNUCTB4MDIwMDAwMDAKKyNkZWZpbmUJRkVfRElWQllaRVJPCTB4MDQwMDAwMDAKKyNkZWZpbmUJRkVfVU5ERVJGTE9XCTB4MDgwMDAwMDAKKyNkZWZpbmUJRkVfT1ZFUkZMT1cJMHgxMDAwMDAwMAorI2RlZmluZQlGRV9JTlZBTElECTB4MjAwMDAwMDAJLyogYWxsIHR5cGVzIG9mIGludmFsaWQgRlAgb3BzICovCisKKy8qCisgKiBUaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUgaGFzIGV4dHJhIGludmFsaWQgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGUKKyAqIHNwZWNpZmljIHR5cGUgb2YgaW52YWxpZCBvcGVyYXRpb24gb2NjdXJyZWQuICBUaGVzZSBmbGFncyBtYXkgYmUKKyAqIHRlc3RlZCwgc2V0LCBhbmQgY2xlYXJlZC0tLWJ1dCBub3QgbWFza2VkLS0tc2VwYXJhdGVseS4gIEFsbCBvZgorICogdGhlc2UgYml0cyBhcmUgY2xlYXJlZCB3aGVuIEZFX0lOVkFMSUQgaXMgY2xlYXJlZCwgYnV0IG9ubHkKKyAqIEZFX1ZYU09GVCBpcyBzZXQgd2hlbiBGRV9JTlZBTElEIGlzIGV4cGxpY2l0bHkgc2V0IGluIHNvZnR3YXJlLgorICovCisjZGVmaW5lCUZFX1ZYQ1ZJCTB4MDAwMDAxMDAJLyogaW52YWxpZCBpbnRlZ2VyIGNvbnZlcnQgKi8KKyNkZWZpbmUJRkVfVlhTUVJUCTB4MDAwMDAyMDAJLyogc3F1YXJlIHJvb3Qgb2YgYSBuZWdhdGl2ZSAqLworI2RlZmluZQlGRV9WWFNPRlQJMHgwMDAwMDQwMAkvKiBzb2Z0d2FyZS1yZXF1ZXN0ZWQgZXhjZXB0aW9uICovCisjZGVmaW5lCUZFX1ZYVkMJCTB4MDAwODAwMDAJLyogb3JkZXJlZCBjb21wYXJpc29uIGludm9sdmluZyBOYU4gKi8KKyNkZWZpbmUJRkVfVlhJTVoJMHgwMDEwMDAwMAkvKiBpbmYgKiAwICovCisjZGVmaW5lCUZFX1ZYWkRaCTB4MDAyMDAwMDAJLyogMCAvIDAgKi8KKyNkZWZpbmUJRkVfVlhJREkJMHgwMDQwMDAwMAkvKiBpbmYgLyBpbmYgKi8KKyNkZWZpbmUJRkVfVlhJU0kJMHgwMDgwMDAwMAkvKiBpbmYgLSBpbmYgKi8KKyNkZWZpbmUJRkVfVlhTTkFOCTB4MDEwMDAwMDAJLyogb3BlcmF0aW9uIG9uIGEgc2lnbmFsbGluZyBOYU4gKi8KKyNkZWZpbmUJRkVfQUxMX0lOVkFMSUQJKEZFX1ZYQ1ZJIHwgRkVfVlhTUVJUIHwgRkVfVlhTT0ZUIHwgRkVfVlhWQyB8IFwKKwkJCSBGRV9WWElNWiB8IEZFX1ZYWkRaIHwgRkVfVlhJREkgfCBGRV9WWElTSSB8IFwKKwkJCSBGRV9WWFNOQU4gfCBGRV9JTlZBTElEKQorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0FMTF9JTlZBTElEIHwgRkVfT1ZFUkZMT1cgfCBGRV9VTkRFUkZMT1cpCisKKy8qIFJvdW5kaW5nIG1vZGVzICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAwMDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDAwMDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MDAwMgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDAwMDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisKK19fQkVHSU5fREVDTFMKKworLyogRGVmYXVsdCBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudCAqLworZXh0ZXJuIGNvbnN0IGZlbnZfdAlfX2ZlX2RmbF9lbnY7CisjZGVmaW5lCUZFX0RGTF9FTlYJKCZfX2ZlX2RmbF9lbnYpCisKKy8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYXAgc3RhdHVzIGZsYWcgcG9zaXRpb25zIHRvIG1hc2sgZmxhZyBwb3NpdGlvbnMgKi8KKyNkZWZpbmUJX0ZQVVNXX1NISUZUCTIyCisjZGVmaW5lCV9FTkFCTEVfTUFTSwkoKEZFX0RJVkJZWkVSTyB8IEZFX0lORVhBQ1QgfCBGRV9JTlZBTElEIHwgXAorCQkJIEZFX09WRVJGTE9XIHwgRkVfVU5ERVJGTE9XKSA+PiBfRlBVU1dfU0hJRlQpCisKKyNkZWZpbmUJX19tZmZzKF9fZW52KQlfX2FzbSBfX3ZvbGF0aWxlKCJtZmZzICUwIiA6ICI9ZiIgKCooX19lbnYpKSkKKyNkZWZpbmUJX19tdGZzZihfX2VudikJX19hc20gX192b2xhdGlsZSgibXRmc2YgMjU1LCUwIiA6IDogImYiIChfX2VudikpCisKK3VuaW9uIF9fZnBzY3IgeworCWRvdWJsZSBfX2Q7CisJc3RydWN0IHsKKwkJX191aW50MzJfdCBfX2p1bms7CisJCWZlbnZfdCBfX3JlZzsKKwl9IF9fYml0czsKK307CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKQorCQlfX2V4Y2VwdHMgfD0gRkVfQUxMX0lOVkFMSUQ7CisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnICY9IH5fX2V4Y2VwdHM7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwkqX19mbGFncCA9IF9fci5fX2JpdHMuX19yZWcgJiBfX2V4Y2VwdHM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRleGNlcHRmbGFnKGNvbnN0IGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX2V4Y2VwdHMgJiBGRV9JTlZBTElEKQorCQlfX2V4Y2VwdHMgfD0gRkVfQUxMX0VYQ0VQVDsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9fZXhjZXB0czsKKwlfX3IuX19iaXRzLl9fcmVnIHw9ICpfX2ZsYWdwICYgX19leGNlcHRzOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpCisJCV9fZXhjZXB0cyB8PSBGRV9WWFNPRlQ7CisJX19tZmZzKCZfX3IuX19kKTsKKwlfX3IuX19iaXRzLl9fcmVnIHw9IF9fZXhjZXB0czsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZldGVzdGV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlyZXR1cm4gKF9fci5fX2JpdHMuX19yZWcgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCXJldHVybiAoX19yLl9fYml0cy5fX3JlZyAmIF9ST1VORF9NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRyb3VuZChpbnQgX19yb3VuZCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCWlmIChfX3JvdW5kICYgfl9ST1VORF9NQVNLKQorCQlyZXR1cm4gKC0xKTsKKwlfX21mZnMoJl9fci5fX2QpOworCV9fci5fX2JpdHMuX19yZWcgJj0gfl9ST1VORF9NQVNLOworCV9fci5fX2JpdHMuX19yZWcgfD0gX19yb3VuZDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZW52KGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwkqX19lbnZwID0gX19yLl9fYml0cy5fX3JlZzsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWhvbGRleGNlcHQoZmVudl90ICpfX2VudnApCit7CisJdW5pb24gX19mcHNjciBfX3I7CisKKwlfX21mZnMoJl9fci5fX2QpOworCSpfX2VudnAgPSBfX3IuX19kOworCV9fci5fX2JpdHMuX19yZWcgJj0gfihGRV9BTExfRVhDRVBUIHwgX0VOQUJMRV9NQVNLKTsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2Zlc2V0ZW52KGNvbnN0IGZlbnZfdCAqX19lbnZwKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19yLl9fYml0cy5fX3JlZyA9ICpfX2VudnA7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKwl1bmlvbiBfX2Zwc2NyIF9fcjsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19yLl9fYml0cy5fX3JlZyAmPSBGRV9BTExfRVhDRVBUOworCV9fci5fX2JpdHMuX19yZWcgfD0gKl9fZW52cDsKKwlfX210ZnNmKF9fci5fX2QpOworCXJldHVybiAoMCk7Cit9CisKKyNpZiBfX0JTRF9WSVNJQkxFCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZW5hYmxlZXhjZXB0KGludCBfX21hc2spCit7CisJdW5pb24gX19mcHNjciBfX3I7CisJZmVudl90IF9fb2xkbWFzazsKKworCV9fbWZmcygmX19yLl9fZCk7CisJX19vbGRtYXNrID0gX19yLl9fYml0cy5fX3JlZzsKKwlfX3IuX19iaXRzLl9fcmVnIHw9IChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA+PiBfRlBVU1dfU0hJRlQ7CisJX19tdGZzZihfX3IuX19kKTsKKwlyZXR1cm4gKChfX29sZG1hc2sgJiBfRU5BQkxFX01BU0spIDw8IF9GUFVTV19TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZGlzYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCWZlbnZfdCBfX29sZG1hc2s7CisKKwlfX21mZnMoJl9fci5fX2QpOworCV9fb2xkbWFzayA9IF9fci5fX2JpdHMuX19yZWc7CisJX19yLl9fYml0cy5fX3JlZyAmPSB+KChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA+PiBfRlBVU1dfU0hJRlQpOworCV9fbXRmc2YoX19yLl9fZCk7CisJcmV0dXJuICgoX19vbGRtYXNrICYgX0VOQUJMRV9NQVNLKSA8PCBfRlBVU1dfU0hJRlQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdCh2b2lkKQoreworCXVuaW9uIF9fZnBzY3IgX19yOworCisJX19tZmZzKCZfX3IuX19kKTsKKwlyZXR1cm4gKChfX3IuX19iaXRzLl9fcmVnICYgX0VOQUJMRV9NQVNLKSA8PCBfRlBVU1dfU0hJRlQpOworfQorCisjZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogIV9GRU5WX0hfICovCmRpZmYgLS1naXQgYS9saWJtL3NwYXJjNjQvTWFrZWZpbGUuaW5jIGIvbGlibS9zcGFyYzY0L01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgzZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcGFyYzY0L01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDQgQEAKKyMgJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcGFyYzY0L01ha2VmaWxlLmluYyx2IDEuMiAyMDA1LzAzLzA3IDA0OjUzOjM2IGRhcyBFeHAgJAorCitBUkNIX1NSQ1M9IGVfc3FydC5TIGVfc3FydGYuUworTERCTF9QUkVDPSAxMTMKZGlmZiAtLWdpdCBhL2xpYm0vc3BhcmM2NC9fZnBtYXRoLmggYi9saWJtL3NwYXJjNjQvX2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmFhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NwYXJjNjQvX2ZwbWF0aC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pa2UgQmFyY3JvZnQgPG1pa2VARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjL3NwYXJjNjQvX2ZwbWF0aC5oLHYgMS41IDIwMDUvMDMvMDcgMDQ6NTU6MjIgZGFzIEV4cCAkCisgKi8KKwordW5pb24gSUVFRWwyYml0cyB7CisJbG9uZyBkb3VibGUJZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTU7CisJCXVuc2lnbmVkIGxvbmcJbWFuaAk6NDg7CisJCXVuc2lnbmVkIGxvbmcJbWFubAk6NjQ7CisJfSBiaXRzOworfTsKKworI2RlZmluZQltYXNrX25iaXRfbCh1KQkoKHZvaWQpMCkKKyNkZWZpbmUJTERCTF9JTVBMSUNJVF9OQklUCisjZGVmaW5lCUxEQkxfTkJJVAkwCisKKyNkZWZpbmUJTERCTF9NQU5IX1NJWkUJNDgKKyNkZWZpbmUJTERCTF9NQU5MX1NJWkUJNjQKKworI2RlZmluZQlMREJMX1RPX0FSUkFZMzIodSwgYSkgZG8gewkJCVwKKwkoYSlbMF0gPSAodWludDMyX3QpKHUpLmJpdHMubWFubDsJCVwKKwkoYSlbMV0gPSAodWludDMyX3QpKCh1KS5iaXRzLm1hbmwgPj4gMzIpOyAgICAgIAlcCisJKGEpWzJdID0gKHVpbnQzMl90KSh1KS5iaXRzLm1hbmg7CQlcCisJKGEpWzNdID0gKHVpbnQzMl90KSgodSkuYml0cy5tYW5oID4+IDMyKTsJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2Vfc3FydC5TIGIvbGlibS9zcGFyYzY0L2Vfc3FydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Zjc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NwYXJjNjQvZV9zcXJ0LlMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZV9zcXJ0LlMsdiAxLjEgMjAwNS8wMi8yMSAxODoyNzo1NyBkYXMgRXhwICQiKQorCitFTlRSWShzcXJ0KQorCXJldGwKKwlmc3FydGQgJWYwLCAlZjAKK0VORChzcXJ0KQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2Vfc3FydGYuUyBiL2xpYm0vc3BhcmM2NC9lX3NxcnRmLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmN2NmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9lX3NxcnRmLlMKQEAgLTAsMCArMSwzMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZV9zcXJ0Zi5TLHYgMS4xIDIwMDUvMDIvMjEgMTg6Mjc6NTcgZGFzIEV4cCAkIikKKworRU5UUlkoc3FydGYpCisJcmV0bAorCWZzcXJ0cyAlZjEsICVmMAorRU5EKHNxcnRmKQpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2ZlbnYuYyBiL2xpYm0vc3BhcmM2NC9mZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhMGY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9mZW52LmMKQEAgLTAsMCArMSwzNiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZmVudi5jLHYgMS4xIDIwMDQvMDYvMDYgMTA6MDU6NTcgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGZlbnYuaD4KKworLyoKKyAqIFRoZSBGU1JfdmVyc2lvbiBmaWVsZCBtYXkgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudAorICogaW1wbGVtZW50YXRpb25zLCBidXQgaXQgaXMgaW1tdXRhYmxlIGFuZCBvcGFxdWUgdG8gdGhlCisgKiBhcHBsaWNhdGlvbi4gIFRodXMsIDAgaXMgdmFsaWQgYXMgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuCisgKi8KK2NvbnN0IGZlbnZfdCBfX2ZlX2RmbF9lbnYgPSAwOwpkaWZmIC0tZ2l0IGEvbGlibS9zcGFyYzY0L2ZlbnYuaCBiL2xpYm0vc3BhcmM2NC9mZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0YzRhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3BhcmM2NC9mZW52LmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NwYXJjNjQvZmVudi5oLHYgMS4zIDIwMDUvMDMvMTYgMTk6MDM6NDYgZGFzIEV4cCAkCisgKi8KKworI2lmbmRlZglfRkVOVl9IXworI2RlZmluZQlfRkVOVl9IXworCisjaW5jbHVkZSA8c3lzL190eXBlcy5oPgorCit0eXBlZGVmCV9fdWludDY0X3QJZmVudl90OwordHlwZWRlZglfX3VpbnQ2NF90CWZleGNlcHRfdDsKKworLyogRXhjZXB0aW9uIGZsYWdzICovCisjZGVmaW5lCUZFX0lOVkFMSUQJMHgwMDAwMDIwMAorI2RlZmluZQlGRV9ESVZCWVpFUk8JMHgwMDAwMDA0MAorI2RlZmluZQlGRV9PVkVSRkxPVwkweDAwMDAwMTAwCisjZGVmaW5lCUZFX1VOREVSRkxPVwkweDAwMDAwMDgwCisjZGVmaW5lCUZFX0lORVhBQ1QJMHgwMDAwMDAyMAorI2RlZmluZQlGRV9BTExfRVhDRVBUCShGRV9ESVZCWVpFUk8gfCBGRV9JTkVYQUNUIHwgXAorCQkJIEZFX0lOVkFMSUQgfCBGRV9PVkVSRkxPVyB8IEZFX1VOREVSRkxPVykKKworLyoKKyAqIFJvdW5kaW5nIG1vZGVzCisgKgorICogV2UgY2FuJ3QganVzdCB1c2UgdGhlIGhhcmR3YXJlIGJpdCB2YWx1ZXMgaGVyZSwgYmVjYXVzZSB0aGF0IHdvdWxkCisgKiBtYWtlIEZFX1VQV0FSRCBhbmQgRkVfRE9XTldBUkQgbmVnYXRpdmUsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLgorICovCisjZGVmaW5lCUZFX1RPTkVBUkVTVAkweDAKKyNkZWZpbmUJRkVfVE9XQVJEWkVSTwkweDEKKyNkZWZpbmUJRkVfVVBXQVJECTB4MgorI2RlZmluZQlGRV9ET1dOV0FSRAkweDMKKyNkZWZpbmUJX1JPVU5EX01BU0sJKEZFX1RPTkVBUkVTVCB8IEZFX0RPV05XQVJEIHwgXAorCQkJIEZFX1VQV0FSRCB8IEZFX1RPV0FSRFpFUk8pCisjZGVmaW5lCV9ST1VORF9TSElGVAkzMAorCitfX0JFR0lOX0RFQ0xTCisKKy8qIERlZmF1bHQgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgKi8KK2V4dGVybiBjb25zdCBmZW52X3QJX19mZV9kZmxfZW52OworI2RlZmluZQlGRV9ERkxfRU5WCSgmX19mZV9kZmxfZW52KQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gbWFwIHN0YXR1cyBmbGFnIHBvc2l0aW9ucyB0byBtYXNrIGZsYWcgcG9zaXRpb25zICovCisjZGVmaW5lIF9GUFVTV19TSElGVAkxOAorI2RlZmluZQlfRU5BQkxFX01BU0sJKEZFX0FMTF9FWENFUFQgPDwgX0ZQVVNXX1NISUZUKQorCisjZGVmaW5lCV9fbGR4ZnNyKF9fcikJX19hc20gX192b2xhdGlsZSgibGR4ICUwLCAlJWZzciIgOiA6ICJtIiAoX19yKSkKKyNkZWZpbmUJX19zdHhmc3IoX19yKQlfX2FzbSBfX3ZvbGF0aWxlKCJzdHggJSVmc3IsICUwIiA6ICI9bSIgKCooX19yKSkpCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlY2xlYXJleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH5fX2V4Y2VwdHM7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGV4Y2VwdGZsYWcoZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwkqX19mbGFncCA9IF9fciAmIF9fZXhjZXB0czsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldGV4Y2VwdGZsYWcoY29uc3QgZmV4Y2VwdF90ICpfX2ZsYWdwLCBpbnQgX19leGNlcHRzKQoreworCWZleGNlcHRfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwlfX3IgJj0gfl9fZXhjZXB0czsKKwlfX3IgfD0gKl9fZmxhZ3AgJiBfX2V4Y2VwdHM7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSW4gY29udHJhc3Qgd2l0aCB0aGUgaWE2NCBwbGF0Zm9ybSwgaXQgc2VlbXMgdG8gYmUgd29ydGh3aGlsZSB0bworICogaW5saW5lIHRoaXMgZnVuY3Rpb24gb24gc3BhcmM2NCBldmVuIHdoZW4gdGhlIGFyZ3VtZW50cyBhcmUgbm90CisgKiBjb21waWxlLXRpbWUgY29uc3RhbnRzLiAgUGVyaGFwcyB0aGlzIGRlcGVuZHMgb24gdGhlIHJlZ2lzdGVyIHdpbmRvdy4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorZmVyYWlzZWV4Y2VwdChpbnQgX19leGNlcHRzKQoreworCXZvbGF0aWxlIGRvdWJsZSBkOworCisJLyoKKwkgKiBXaXRoIGEgY29tcGlsZXIgdGhhdCBzdXBwb3J0cyB0aGUgRkVOVl9BQ0NFU1MgcHJhZ21hCisJICogcHJvcGVybHksIHNpbXBsZSBleHByZXNzaW9ucyBsaWtlICcwLjAgLyAwLjAnIHNob3VsZAorCSAqIGJlIHN1ZmZpY2llbnQgdG8gZ2VuZXJhdGUgdHJhcHMuICBVbmZvcnR1bmF0ZWx5LCB3ZQorCSAqIG5lZWQgdG8gYnJpbmcgYSB2b2xhdGlsZSB2YXJpYWJsZSBpbnRvIHRoZSBlcXVhdGlvbgorCSAqIHRvIHByZXZlbnQgaW5jb3JyZWN0IG9wdGltaXphdGlvbnMuCisJICovCisJaWYgKF9fZXhjZXB0cyAmIEZFX0lOVkFMSUQpIHsKKwkJZCA9IDAuMDsKKwkJZCA9IDAuMCAvIGQ7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9ESVZCWVpFUk8pIHsKKwkJZCA9IDAuMDsKKwkJZCA9IDEuMCAvIGQ7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9PVkVSRkxPVykgeworCQlkID0gMHgxLmZmcDEwMjM7CisJCWQgKj0gMi4wOworCX0KKwlpZiAoX19leGNlcHRzICYgRkVfVU5ERVJGTE9XKSB7CisJCWQgPSAweDFwLTEwMjI7CisJCWQgLz0gMHgxcDEwMjM7CisJfQorCWlmIChfX2V4Y2VwdHMgJiBGRV9JTkVYQUNUKSB7CisJCWQgPSAweDFwLTEwMjI7CisJCWQgKz0gMS4wOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXRlc3RleGNlcHQoaW50IF9fZXhjZXB0cykKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJcmV0dXJuIChfX3IgJiBfX2V4Y2VwdHMpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldHJvdW5kKHZvaWQpCit7CisJZmVudl90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoKF9fciA+PiBfUk9VTkRfU0hJRlQpICYgX1JPVU5EX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXNldHJvdW5kKGludCBfX3JvdW5kKQoreworCWZlbnZfdCBfX3I7CisKKwlpZiAoX19yb3VuZCAmIH5fUk9VTkRfTUFTSykKKwkJcmV0dXJuICgtMSk7CisJX19zdHhmc3IoJl9fcik7CisJX19yICY9IH4oX1JPVU5EX01BU0sgPDwgX1JPVU5EX1NISUZUKTsKKwlfX3IgfD0gX19yb3VuZCA8PCBfUk9VTkRfU0hJRlQ7CisJX19sZHhmc3IoX19yKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWdldGVudihmZW52X3QgKl9fZW52cCkKK3sKKworCV9fc3R4ZnNyKF9fZW52cCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVob2xkZXhjZXB0KGZlbnZfdCAqX19lbnZwKQoreworCWZlbnZfdCBfX3I7CisKKwlfX3N0eGZzcigmX19yKTsKKwkqX19lbnZwID0gX19yOworCV9fciAmPSB+KEZFX0FMTF9FWENFUFQgfCBfRU5BQkxFX01BU0spOworCV9fbGR4ZnNyKF9fcik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorZmVzZXRlbnYoY29uc3QgZmVudl90ICpfX2VudnApCit7CisKKwlfX2xkeGZzcigqX19lbnZwKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZXVwZGF0ZWVudihjb25zdCBmZW52X3QgKl9fZW52cCkKK3sKKwlmZXhjZXB0X3QgX19yOworCisJX19zdHhmc3IoJl9fcik7CisJX19sZHhmc3IoKl9fZW52cCk7CisJZmVyYWlzZWV4Y2VwdChfX3IgJiBGRV9BTExfRVhDRVBUKTsKKwlyZXR1cm4gKDApOworfQorCisjaWYgX19CU0RfVklTSUJMRQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWVuYWJsZWV4Y2VwdChpbnQgX19tYXNrKQoreworCWZlbnZfdCBfX29sZF9yLCBfX25ld19yOworCisJX19zdHhmc3IoJl9fb2xkX3IpOworCV9fbmV3X3IgPSBfX29sZF9yIHwgKChfX21hc2sgJiBGRV9BTExfRVhDRVBUKSA8PCBfRlBVU1dfU0hJRlQpOworCV9fbGR4ZnNyKF9fbmV3X3IpOworCXJldHVybiAoKF9fb2xkX3IgPj4gX0ZQVVNXX1NISUZUKSAmIEZFX0FMTF9FWENFUFQpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitmZWRpc2FibGVleGNlcHQoaW50IF9fbWFzaykKK3sKKwlmZW52X3QgX19vbGRfciwgX19uZXdfcjsKKworCV9fc3R4ZnNyKCZfX29sZF9yKTsKKwlfX25ld19yID0gX19vbGRfciAmIH4oKF9fbWFzayAmIEZFX0FMTF9FWENFUFQpIDw8IF9GUFVTV19TSElGVCk7CisJX19sZHhmc3IoX19uZXdfcik7CisJcmV0dXJuICgoX19vbGRfciA+PiBfRlBVU1dfU0hJRlQpICYgRkVfQUxMX0VYQ0VQVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ZlZ2V0ZXhjZXB0KHZvaWQpCit7CisJZmVudl90IF9fcjsKKworCV9fc3R4ZnNyKCZfX3IpOworCXJldHVybiAoKF9fciAmIF9FTkFCTEVfTUFTSykgPj4gX0ZQVVNXX1NISUZUKTsKK30KKworI2VuZGlmIC8qIF9fQlNEX1ZJU0lCTEUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qICFfRkVOVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hY29zLmMgYi9saWJtL3NyYy9lX2Fjb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE2NzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zLmMKQEAgLTAsMCArMSwxMDQgQEAKKworLyogQCgjKWVfYWNvcy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2Fjb3MuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9hY29zKHgpCisgKiBNZXRob2QgOiAgICAgICAgICAgICAgICAgIAorICoJYWNvcyh4KSAgPSBwaS8yIC0gYXNpbih4KQorICoJYWNvcygteCkgPSBwaS8yICsgYXNpbih4KQorICogRm9yIHx4fDw9MC41CisgKglhY29zKHgpID0gcGkvMiAtICh4ICsgeCp4XjIqUih4XjIpKQkoc2VlIGFzaW4uYykKKyAqIEZvciB4PjAuNQorICogCWFjb3MoeCkgPSBwaS8yIC0gKHBpLzIgLSAyYXNpbihzcXJ0KCgxLXgpLzIpKSkKKyAqCQk9IDJhc2luKHNxcnQoKDEteCkvMikpICAKKyAqCQk9IDJzICsgMnMqeipSKHopIAkuLi56PSgxLXgpLzIsIHM9c3FydCh6KQorICoJCT0gMmYgKyAoMmMgKyAycyp6KlIoeikpCisgKiAgICAgd2hlcmUgZj1oaSBwYXJ0IG9mIHMsIGFuZCBjID0gKHotZipmKS8ocytmKSBpcyB0aGUgY29ycmVjdGlvbiB0ZXJtCisgKiAgICAgZm9yIGYgc28gdGhhdCBmK2MgfiBzcXJ0KHopLgorICogRm9yIHg8LTAuNQorICoJYWNvcyh4KSA9IHBpIC0gMmFzaW4oc3FydCgoMS18eHwpLzIpKQorICoJCT0gcGkgLSAwLjUqKHMrcyp6KlIoeikpLCB3aGVyZSB6PSgxLXx4fCkvMixzPXNxcnQoeikKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJaWYgeCBpcyBOYU4sIHJldHVybiB4IGl0c2VsZjsKKyAqCWlmIHx4fD4xLCByZXR1cm4gTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisgKgorICogRnVuY3Rpb24gbmVlZGVkOiBzcXJ0CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3BpID0gIDMuMTQxNTkyNjUzNTg5NzkzMTE2MDBlKzAwLCAvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2hpID0gIDEuNTcwNzk2MzI2Nzk0ODk2NTU4MDBlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2xvID0gIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCitwUzAgPSAgMS42NjY2NjY2NjY2NjY2NjY1NzQxNWUtMDEsIC8qIDB4M0ZDNTU1NTUsIDB4NTU1NTU1NTUgKi8KK3BTMSA9IC0zLjI1NTY1ODE4NjIyNDAwOTE1NDA1ZS0wMSwgLyogMHhCRkQ0RDYxMiwgMHgwM0VCNkY3RCAqLworcFMyID0gIDIuMDEyMTI1MzIxMzQ4NjI5MjU4ODFlLTAxLCAvKiAweDNGQzlDMTU1LCAweDBFODg0NDU1ICovCitwUzMgPSAtNC4wMDU1NTM0NTAwNjc5NDExNDAyN2UtMDIsIC8qIDB4QkZBNDgyMjgsIDB4QjU2ODhGM0IgKi8KK3BTNCA9ICA3LjkxNTM0OTk0Mjg5ODE0NTMyMTc2ZS0wNCwgLyogMHgzRjQ5RUZFMCwgMHg3NTAxQjI4OCAqLworcFM1ID0gIDMuNDc5MzMxMDc1OTYwMjExNjc1NzBlLTA1LCAvKiAweDNGMDIzREUxLCAweDBERkRGNzA5ICovCitxUzEgPSAtMi40MDMzOTQ5MTE3MzQ0MTQyMTg3OGUrMDAsIC8qIDB4QzAwMzNBMjcsIDB4MUM4QTJENEIgKi8KK3FTMiA9ICAyLjAyMDk0NTc2MDIzMzUwNTY5NDcxZSswMCwgLyogMHg0MDAwMkFFNSwgMHg5QzU5OEFDOCAqLworcVMzID0gLTYuODgyODM5NzE2MDU0NTMyOTMwMzBlLTAxLCAvKiAweEJGRTYwNjZDLCAweDFCOEQwMTU5ICovCitxUzQgPSAgNy43MDM4MTUwNTU1OTAxOTM1Mjc5MWUtMDI7IC8qIDB4M0ZCM0I4QzUsIDB4QjEyRTkyODIgKi8KKworZG91YmxlCitfX2llZWU3NTRfYWNvcyhkb3VibGUgeCkKK3sKKwlkb3VibGUgeixwLHEscix3LHMsYyxkZjsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDNmZjAwMDAwKSB7CS8qIHx4fCA+PSAxICovCisJICAgIHVfaW50MzJfdCBseDsKKwkgICAgR0VUX0xPV19XT1JEKGx4LHgpOworCSAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkgewkvKiB8eHw9PTEgKi8KKwkJaWYoaHg+MCkgcmV0dXJuIDAuMDsJCS8qIGFjb3MoMSkgPSAwICAqLworCQllbHNlIHJldHVybiBwaSsyLjAqcGlvMl9sbzsJLyogYWNvcygtMSk9IHBpICovCisJICAgIH0KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOwkJLyogYWNvcyh8eHw+MSkgaXMgTmFOICovCisJfQorCWlmKGl4PDB4M2ZlMDAwMDApIHsJLyogfHh8IDwgMC41ICovCisJICAgIGlmKGl4PD0weDNjNjAwMDAwKSByZXR1cm4gcGlvMl9oaStwaW8yX2xvOy8qaWZ8eHw8MioqLTU3Ki8KKwkgICAgeiA9IHgqeDsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgcmV0dXJuIHBpbzJfaGkgLSAoeCAtIChwaW8yX2xvLXgqcikpOworCX0gZWxzZSAgaWYgKGh4PDApIHsJCS8qIHggPCAtMC41ICovCisJICAgIHogPSAob25lK3gpKjAuNTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgcyA9IHNxcnQoeik7CisJICAgIHIgPSBwL3E7CisJICAgIHcgPSByKnMtcGlvMl9sbzsKKwkgICAgcmV0dXJuIHBpIC0gMi4wKihzK3cpOworCX0gZWxzZSB7CQkJLyogeCA+IDAuNSAqLworCSAgICB6ID0gKG9uZS14KSowLjU7CisJICAgIHMgPSBzcXJ0KHopOworCSAgICBkZiA9IHM7CisJICAgIFNFVF9MT1dfV09SRChkZiwwKTsKKwkgICAgYyAgPSAoei1kZipkZikvKHMrZGYpOworCSAgICBwID0geioocFMwK3oqKHBTMSt6KihwUzIreioocFMzK3oqKHBTNCt6KnBTNSkpKSkpOworCSAgICBxID0gb25lK3oqKHFTMSt6KihxUzIreioocVMzK3oqcVM0KSkpOworCSAgICByID0gcC9xOworCSAgICB3ID0gcipzK2M7CisJICAgIHJldHVybiAyLjAqKGRmK3cpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvc2YuYyBiL2xpYm0vc3JjL2VfYWNvc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFmNDhlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hY29zZi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIGVfYWNvc2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYWNvcy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zZi5jLHYgMS43IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitwaSA9ICAzLjE0MTU5MjUwMjZlKzAwLCAvKiAweDQwNDkwZmRhICovCitwaW8yX2hpID0gIDEuNTcwNzk2MjUxM2UrMDAsIC8qIDB4M2ZjOTBmZGEgKi8KK3BpbzJfbG8gPSAgNy41NDk3ODk0MTU5ZS0wOCwgLyogMHgzM2EyMjE2OCAqLworcFMwID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK3BTMSA9IC0zLjI1NTY1ODE0OTdlLTAxLCAvKiAweGJlYTZiMDkwICovCitwUzIgPSAgMi4wMTIxMjUyNTM3ZS0wMSwgLyogMHgzZTRlMGFhOCAqLworcFMzID0gLTQuMDA1NTUzNTczNGUtMDIsIC8qIDB4YmQyNDExNDYgKi8KK3BTNCA9ICA3LjkxNTM1MDE0MjllLTA0LCAvKiAweDNhNGY3ZjA0ICovCitwUzUgPSAgMy40NzkzMzA5MTY5ZS0wNSwgLyogMHgzODExZWYwOCAqLworcVMxID0gLTIuNDAzMzk0OTM3NWUrMDAsIC8qIDB4YzAxOWQxMzkgKi8KK3FTMiA9ICAyLjAyMDk0NTc4NzRlKzAwLCAvKiAweDQwMDE1NzJkICovCitxUzMgPSAtNi44ODI4Mzk3OTg5ZS0wMSwgLyogMHhiZjMwMzM2MSAqLworcVM0ID0gIDcuNzAzODE1NDAwNmUtMDI7IC8qIDB4M2Q5ZGM2MmUgKi8KKworZmxvYXQKK19faWVlZTc1NF9hY29zZihmbG9hdCB4KQoreworCWZsb2F0IHoscCxxLHIsdyxzLGMsZGY7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg9PTB4M2Y4MDAwMDApIHsJCS8qIHx4fD09MSAqLworCSAgICBpZihoeD4wKSByZXR1cm4gMC4wOwkvKiBhY29zKDEpID0gMCAgKi8KKwkgICAgZWxzZSByZXR1cm4gcGkrKGZsb2F0KTIuMCpwaW8yX2xvOwkvKiBhY29zKC0xKT0gcGkgKi8KKwl9IGVsc2UgaWYoaXg+MHgzZjgwMDAwMCkgewkvKiB8eHwgPj0gMSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CQkvKiBhY29zKHx4fD4xKSBpcyBOYU4gKi8KKwl9CisJaWYoaXg8MHgzZjAwMDAwMCkgewkvKiB8eHwgPCAwLjUgKi8KKwkgICAgaWYoaXg8PTB4MjMwMDAwMDApIHJldHVybiBwaW8yX2hpK3BpbzJfbG87LyppZnx4fDwyKiotNTcqLworCSAgICB6ID0geCp4OworCSAgICBwID0geioocFMwK3oqKHBTMSt6KihwUzIreioocFMzK3oqKHBTNCt6KnBTNSkpKSkpOworCSAgICBxID0gb25lK3oqKHFTMSt6KihxUzIreioocVMzK3oqcVM0KSkpOworCSAgICByID0gcC9xOworCSAgICByZXR1cm4gcGlvMl9oaSAtICh4IC0gKHBpbzJfbG8teCpyKSk7CisJfSBlbHNlICBpZiAoaHg8MCkgewkJLyogeCA8IC0wLjUgKi8KKwkgICAgeiA9IChvbmUreCkqKGZsb2F0KTAuNTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgcyA9IF9faWVlZTc1NF9zcXJ0Zih6KTsKKwkgICAgciA9IHAvcTsKKwkgICAgdyA9IHIqcy1waW8yX2xvOworCSAgICByZXR1cm4gcGkgLSAoZmxvYXQpMi4wKihzK3cpOworCX0gZWxzZSB7CQkJLyogeCA+IDAuNSAqLworCSAgICBpbnQzMl90IGlkZjsKKwkgICAgeiA9IChvbmUteCkqKGZsb2F0KTAuNTsKKwkgICAgcyA9IF9faWVlZTc1NF9zcXJ0Zih6KTsKKwkgICAgZGYgPSBzOworCSAgICBHRVRfRkxPQVRfV09SRChpZGYsZGYpOworCSAgICBTRVRfRkxPQVRfV09SRChkZixpZGYmMHhmZmZmZjAwMCk7CisJICAgIGMgID0gKHotZGYqZGYpLyhzK2RmKTsKKwkgICAgcCA9IHoqKHBTMCt6KihwUzEreioocFMyK3oqKHBTMyt6KihwUzQreipwUzUpKSkpKTsKKwkgICAgcSA9IG9uZSt6KihxUzEreioocVMyK3oqKHFTMyt6KnFTNCkpKTsKKwkgICAgciA9IHAvcTsKKwkgICAgdyA9IHIqcytjOworCSAgICByZXR1cm4gKGZsb2F0KTIuMCooZGYrdyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hY29zaC5jIGIvbGlibS9zcmMvZV9hY29zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjE1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Fjb3NoLmMKQEAgLTAsMCArMSw2MyBAQAorCisvKiBAKCMpZV9hY29zaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hY29zaC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYWNvc2goeCkKKyAqIE1ldGhvZCA6CisgKglCYXNlZCBvbiAKKyAqCQlhY29zaCh4KSA9IGxvZyBbIHggKyBzcXJ0KHgqeC0xKSBdCisgKgl3ZSBoYXZlCisgKgkJYWNvc2goeCkgOj0gbG9nKHgpK2xuMiwJaWYgeCBpcyBsYXJnZTsgZWxzZQorICoJCWFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCisgKgkJYWNvc2goeCkgOj0gbG9nMXAodCtzcXJ0KDIuMCp0K3QqdCkpOyB3aGVyZSB0PXgtMS4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJYWNvc2goeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHg8MS4KKyAqCWFjb3NoKE5hTikgaXMgTmFOIHdpdGhvdXQgc2lnbmFsLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZQk9IDEuMCwKK2xuMgk9IDYuOTMxNDcxODA1NTk5NDUyODYyMjdlLTAxOyAgLyogMHgzRkU2MkU0MiwgMHhGRUZBMzlFRiAqLworCitkb3VibGUKK19faWVlZTc1NF9hY29zaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdDsKKwlpbnQzMl90IGh4OworCXVfaW50MzJfdCBseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWlmKGh4PDB4M2ZmMDAwMDApIHsJCS8qIHggPCAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsKKwl9IGVsc2UgaWYoaHggPj0weDQxYjAwMDAwKSB7CS8qIHggPiAyKioyOCAqLworCSAgICBpZihoeCA+PTB4N2ZmMDAwMDApIHsJLyogeCBpcyBpbmYgb2YgTmFOICovCisJICAgICAgICByZXR1cm4geCt4OworCSAgICB9IGVsc2UgCisJCXJldHVybiBfX2llZWU3NTRfbG9nKHgpK2xuMjsJLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworCX0gZWxzZSBpZigoKGh4LTB4M2ZmMDAwMDApfGx4KT09MCkgeworCSAgICByZXR1cm4gMC4wOwkJCS8qIGFjb3NoKDEpID0gMCAqLworCX0gZWxzZSBpZiAoaHggPiAweDQwMDAwMDAwKSB7CS8qIDIqKjI4ID4geCA+IDIgKi8KKwkgICAgdD14Kng7CisJICAgIHJldHVybiBfX2llZWU3NTRfbG9nKDIuMCp4LW9uZS8oeCtzcXJ0KHQtb25lKSkpOworCX0gZWxzZSB7CQkJLyogMTx4PDIgKi8KKwkgICAgdCA9IHgtb25lOworCSAgICByZXR1cm4gbG9nMXAodCtzcXJ0KDIuMCp0K3QqdCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYWNvc2hmLmMgYi9saWJtL3NyYy9lX2Fjb3NoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTc5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Fjb3NoZi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGVfYWNvc2hmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2Fjb3NoLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2Fjb3NoZi5jLHYgMS43IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZQk9IDEuMCwKK2xuMgk9IDYuOTMxNDcxODI0NmUtMDE7ICAvKiAweDNmMzE3MjE4ICovCisKK2Zsb2F0CitfX2llZWU3NTRfYWNvc2hmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKwlpbnQzMl90IGh4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWlmKGh4PDB4M2Y4MDAwMDApIHsJCS8qIHggPCAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsKKwl9IGVsc2UgaWYoaHggPj0weDRkODAwMDAwKSB7CS8qIHggPiAyKioyOCAqLworCSAgICBpZihoeCA+PTB4N2Y4MDAwMDApIHsJLyogeCBpcyBpbmYgb2YgTmFOICovCisJICAgICAgICByZXR1cm4geCt4OworCSAgICB9IGVsc2UKKwkJcmV0dXJuIF9faWVlZTc1NF9sb2dmKHgpK2xuMjsJLyogYWNvc2goaHVnZSk9bG9nKDJ4KSAqLworCX0gZWxzZSBpZiAoaHg9PTB4M2Y4MDAwMDApIHsKKwkgICAgcmV0dXJuIDAuMDsJCQkvKiBhY29zaCgxKSA9IDAgKi8KKwl9IGVsc2UgaWYgKGh4ID4gMHg0MDAwMDAwMCkgewkvKiAyKioyOCA+IHggPiAyICovCisJICAgIHQ9eCp4OworCSAgICByZXR1cm4gX19pZWVlNzU0X2xvZ2YoKGZsb2F0KTIuMCp4LW9uZS8oeCtfX2llZWU3NTRfc3FydGYodC1vbmUpKSk7CisJfSBlbHNlIHsJCQkvKiAxPHg8MiAqLworCSAgICB0ID0geC1vbmU7CisJICAgIHJldHVybiBsb2cxcGYodCtfX2llZWU3NTRfc3FydGYoKGZsb2F0KTIuMCp0K3QqdCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXNpbi5jIGIvbGlibS9zcmMvZV9hc2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNzAyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYXNpbi5jCkBAIC0wLDAgKzEsMTEzIEBACisKKy8qIEAoIyllX2FzaW4uYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hc2luLmMsdiAxLjExIDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYXNpbih4KQorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqCVNpbmNlICBhc2luKHgpID0geCArIHheMy82ICsgeF41KjMvNDAgKyB4XjcqMTUvMzM2ICsgLi4uCisgKgl3ZSBhcHByb3hpbWF0ZSBhc2luKHgpIG9uIFswLDAuNV0gYnkKKyAqCQlhc2luKHgpID0geCArIHgqeF4yKlIoeF4yKQorICoJd2hlcmUKKyAqCQlSKHheMikgaXMgYSByYXRpb25hbCBhcHByb3hpbWF0aW9uIG9mIChhc2luKHgpLXgpL3heMyAKKyAqCWFuZCBpdHMgcmVtZXogZXJyb3IgaXMgYm91bmRlZCBieQorICoJCXwoYXNpbih4KS14KS94XjMgLSBSKHheMil8IDwgMl4oLTU4Ljc1KQorICoKKyAqCUZvciB4IGluIFswLjUsMV0KKyAqCQlhc2luKHgpID0gcGkvMi0yKmFzaW4oc3FydCgoMS14KS8yKSkKKyAqCUxldCB5ID0gKDEteCksIHogPSB5LzIsIHMgOj0gc3FydCh6KSwgYW5kIHBpbzJfaGkrcGlvMl9sbz1waS8yOworICoJdGhlbiBmb3IgeD4wLjk4CisgKgkJYXNpbih4KSA9IHBpLzIgLSAyKihzK3MqeipSKHopKQorICoJCQk9IHBpbzJfaGkgLSAoMioocytzKnoqUih6KSkgLSBwaW8yX2xvKQorICoJRm9yIHg8PTAuOTgsIGxldCBwaW80X2hpID0gcGlvMl9oaS8yLCB0aGVuCisgKgkJZiA9IGhpIHBhcnQgb2YgczsKKyAqCQljID0gc3FydCh6KSAtIGYgPSAoei1mKmYpLyhzK2YpIAkuLi5mK2M9c3FydCh6KQorICoJYW5kCisgKgkJYXNpbih4KSA9IHBpLzIgLSAyKihzK3MqeipSKHopKQorICoJCQk9IHBpbzRfaGkrKHBpbzQtMnMpLSgycyp6KlIoeiktcGlvMl9sbykKKyAqCQkJPSBwaW80X2hpKyhwaW80LTJmKS0oMnMqeipSKHopLShwaW8yX2xvKzJjKSkKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJaWYgeCBpcyBOYU4sIHJldHVybiB4IGl0c2VsZjsKKyAqCWlmIHx4fD4xLCByZXR1cm4gTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisgKgorICovCisKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitodWdlID0gIDEuMDAwZSszMDAsCitwaW8yX2hpID0gIDEuNTcwNzk2MzI2Nzk0ODk2NTU4MDBlKzAwLCAvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitwaW8yX2xvID0gIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCitwaW80X2hpID0gIDcuODUzOTgxNjMzOTc0NDgyNzg5OTllLTAxLCAvKiAweDNGRTkyMUZCLCAweDU0NDQyRDE4ICovCisJLyogY29lZmZpY2llbnQgZm9yIFIoeF4yKSAqLworcFMwID0gIDEuNjY2NjY2NjY2NjY2NjY2NTc0MTVlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTU1ICovCitwUzEgPSAtMy4yNTU2NTgxODYyMjQwMDkxNTQwNWUtMDEsIC8qIDB4QkZENEQ2MTIsIDB4MDNFQjZGN0QgKi8KK3BTMiA9ICAyLjAxMjEyNTMyMTM0ODYyOTI1ODgxZS0wMSwgLyogMHgzRkM5QzE1NSwgMHgwRTg4NDQ1NSAqLworcFMzID0gLTQuMDA1NTUzNDUwMDY3OTQxMTQwMjdlLTAyLCAvKiAweEJGQTQ4MjI4LCAweEI1Njg4RjNCICovCitwUzQgPSAgNy45MTUzNDk5NDI4OTgxNDUzMjE3NmUtMDQsIC8qIDB4M0Y0OUVGRTAsIDB4NzUwMUIyODggKi8KK3BTNSA9ICAzLjQ3OTMzMTA3NTk2MDIxMTY3NTcwZS0wNSwgLyogMHgzRjAyM0RFMSwgMHgwREZERjcwOSAqLworcVMxID0gLTIuNDAzMzk0OTExNzM0NDE0MjE4NzhlKzAwLCAvKiAweEMwMDMzQTI3LCAweDFDOEEyRDRCICovCitxUzIgPSAgMi4wMjA5NDU3NjAyMzM1MDU2OTQ3MWUrMDAsIC8qIDB4NDAwMDJBRTUsIDB4OUM1OThBQzggKi8KK3FTMyA9IC02Ljg4MjgzOTcxNjA1NDUzMjkzMDMwZS0wMSwgLyogMHhCRkU2MDY2QywgMHgxQjhEMDE1OSAqLworcVM0ID0gIDcuNzAzODE1MDU1NTkwMTkzNTI3OTFlLTAyOyAvKiAweDNGQjNCOEM1LCAweEIxMkU5MjgyICovCisKK2RvdWJsZQorX19pZWVlNzU0X2FzaW4oZG91YmxlIHgpCit7CisJZG91YmxlIHQ9MC4wLHcscCxxLGMscixzOworCWludDMyX3QgaHgsaXg7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PSAweDNmZjAwMDAwKSB7CQkvKiB8eHw+PSAxICovCisJICAgIHVfaW50MzJfdCBseDsKKwkgICAgR0VUX0xPV19XT1JEKGx4LHgpOworCSAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkKKwkJICAgIC8qIGFzaW4oMSk9Ky1waS8yIHdpdGggaW5leGFjdCAqLworCQlyZXR1cm4geCpwaW8yX2hpK3gqcGlvMl9sbzsJCisJICAgIHJldHVybiAoeC14KS8oeC14KTsJCS8qIGFzaW4ofHh8PjEpIGlzIE5hTiAqLyAgIAorCX0gZWxzZSBpZiAoaXg8MHgzZmUwMDAwMCkgewkvKiB8eHw8MC41ICovCisJICAgIGlmKGl4PDB4M2U0MDAwMDApIHsJCS8qIGlmIHx4fCA8IDIqKi0yNyAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgaWYgeCE9MCovCisJICAgIH0gZWxzZSAKKwkJdCA9IHgqeDsKKwkJcCA9IHQqKHBTMCt0KihwUzErdCoocFMyK3QqKHBTMyt0KihwUzQrdCpwUzUpKSkpKTsKKwkJcSA9IG9uZSt0KihxUzErdCoocVMyK3QqKHFTMyt0KnFTNCkpKTsKKwkJdyA9IHAvcTsKKwkJcmV0dXJuIHgreCp3OworCX0KKwkvKiAxPiB8eHw+PSAwLjUgKi8KKwl3ID0gb25lLWZhYnMoeCk7CisJdCA9IHcqMC41OworCXAgPSB0KihwUzArdCoocFMxK3QqKHBTMit0KihwUzMrdCoocFM0K3QqcFM1KSkpKSk7CisJcSA9IG9uZSt0KihxUzErdCoocVMyK3QqKHFTMyt0KnFTNCkpKTsKKwlzID0gc3FydCh0KTsKKwlpZihpeD49MHgzRkVGMzMzMykgeyAJLyogaWYgfHh8ID4gMC45NzUgKi8KKwkgICAgdyA9IHAvcTsKKwkgICAgdCA9IHBpbzJfaGktKDIuMCoocytzKncpLXBpbzJfbG8pOworCX0gZWxzZSB7CisJICAgIHcgID0gczsKKwkgICAgU0VUX0xPV19XT1JEKHcsMCk7CisJICAgIGMgID0gKHQtdyp3KS8ocyt3KTsKKwkgICAgciAgPSBwL3E7CisJICAgIHAgID0gMi4wKnMqci0ocGlvMl9sby0yLjAqYyk7CisJICAgIHEgID0gcGlvNF9oaS0yLjAqdzsKKwkgICAgdCAgPSBwaW80X2hpLShwLXEpOworCX0gICAgCisJaWYoaHg+MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OyAgICAKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXNpbmYuYyBiL2xpYm0vc3JjL2VfYXNpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA1ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9hc2luZi5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIGVfYXNpbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYXNpbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hc2luZi5jLHYgMS45IDIwMDUvMTIvMDQgMTM6NTI6NDYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitodWdlID0gIDEuMDAwZSszMCwKK3BpbzJfaGkgPSAgMS41NzA3OTYyNTEzZSswMCwgLyogMHgzZmM5MGZkYSAqLworcGlvMl9sbyA9ICA3LjU0OTc4OTQxNTllLTA4LCAvKiAweDMzYTIyMTY4ICovCitwaW80X2hpID0gIDcuODUzOTgxMjU2NWUtMDEsIC8qIDB4M2Y0OTBmZGEgKi8KKwkvKiBjb2VmZmljaWVudCBmb3IgUih4XjIpICovCitwUzAgPSAgMS42NjY2NjY3MTYzZS0wMSwgLyogMHgzZTJhYWFhYiAqLworcFMxID0gLTMuMjU1NjU4MTQ5N2UtMDEsIC8qIDB4YmVhNmIwOTAgKi8KK3BTMiA9ICAyLjAxMjEyNTI1MzdlLTAxLCAvKiAweDNlNGUwYWE4ICovCitwUzMgPSAtNC4wMDU1NTM1NzM0ZS0wMiwgLyogMHhiZDI0MTE0NiAqLworcFM0ID0gIDcuOTE1MzUwMTQyOWUtMDQsIC8qIDB4M2E0ZjdmMDQgKi8KK3BTNSA9ICAzLjQ3OTMzMDkxNjllLTA1LCAvKiAweDM4MTFlZjA4ICovCitxUzEgPSAtMi40MDMzOTQ5Mzc1ZSswMCwgLyogMHhjMDE5ZDEzOSAqLworcVMyID0gIDIuMDIwOTQ1Nzg3NGUrMDAsIC8qIDB4NDAwMTU3MmQgKi8KK3FTMyA9IC02Ljg4MjgzOTc5ODllLTAxLCAvKiAweGJmMzAzMzYxICovCitxUzQgPSAgNy43MDM4MTU0MDA2ZS0wMjsgLyogMHgzZDlkYzYyZSAqLworCitmbG9hdAorX19pZWVlNzU0X2FzaW5mKGZsb2F0IHgpCit7CisJZmxvYXQgdD0wLjAsdyxwLHEsYyxyLHM7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg9PTB4M2Y4MDAwMDApIHsKKwkJLyogYXNpbigxKT0rLXBpLzIgd2l0aCBpbmV4YWN0ICovCisJICAgIHJldHVybiB4KnBpbzJfaGkreCpwaW8yX2xvOworCX0gZWxzZSBpZihpeD4gMHgzZjgwMDAwMCkgewkvKiB8eHw+PSAxICovCisJICAgIHJldHVybiAoeC14KS8oeC14KTsJCS8qIGFzaW4ofHh8PjEpIGlzIE5hTiAqLworCX0gZWxzZSBpZiAoaXg8MHgzZjAwMDAwMCkgewkvKiB8eHw8MC41ICovCisJICAgIGlmKGl4PDB4MzIwMDAwMDApIHsJCS8qIGlmIHx4fCA8IDIqKi0yNyAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsvKiByZXR1cm4geCB3aXRoIGluZXhhY3QgaWYgeCE9MCovCisJICAgIH0gZWxzZQorCQl0ID0geCp4OworCQlwID0gdCoocFMwK3QqKHBTMSt0KihwUzIrdCoocFMzK3QqKHBTNCt0KnBTNSkpKSkpOworCQlxID0gb25lK3QqKHFTMSt0KihxUzIrdCoocVMzK3QqcVM0KSkpOworCQl3ID0gcC9xOworCQlyZXR1cm4geCt4Knc7CisJfQorCS8qIDE+IHx4fD49IDAuNSAqLworCXcgPSBvbmUtZmFic2YoeCk7CisJdCA9IHcqKGZsb2F0KTAuNTsKKwlwID0gdCoocFMwK3QqKHBTMSt0KihwUzIrdCoocFMzK3QqKHBTNCt0KnBTNSkpKSkpOworCXEgPSBvbmUrdCoocVMxK3QqKHFTMit0KihxUzMrdCpxUzQpKSk7CisJcyA9IF9faWVlZTc1NF9zcXJ0Zih0KTsKKwlpZihpeD49MHgzRjc5OTk5QSkgeyAJLyogaWYgfHh8ID4gMC45NzUgKi8KKwkgICAgdyA9IHAvcTsKKwkgICAgdCA9IHBpbzJfaGktKChmbG9hdCkyLjAqKHMrcyp3KS1waW8yX2xvKTsKKwl9IGVsc2UgeworCSAgICBpbnQzMl90IGl3OworCSAgICB3ICA9IHM7CisJICAgIEdFVF9GTE9BVF9XT1JEKGl3LHcpOworCSAgICBTRVRfRkxPQVRfV09SRCh3LGl3JjB4ZmZmZmYwMDApOworCSAgICBjICA9ICh0LXcqdykvKHMrdyk7CisJICAgIHIgID0gcC9xOworCSAgICBwICA9IChmbG9hdCkyLjAqcypyLShwaW8yX2xvLShmbG9hdCkyLjAqYyk7CisJICAgIHEgID0gcGlvNF9oaS0oZmxvYXQpMi4wKnc7CisJICAgIHQgID0gcGlvNF9oaS0ocC1xKTsKKwl9CisJaWYoaHg+MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuMi5jIGIvbGlibS9zcmMvZV9hdGFuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2Y4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW4yLmMKQEAgLTAsMCArMSwxMjQgQEAKKworLyogQCgjKWVfYXRhbjIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXRhbjIuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9hdGFuMih5LHgpCisgKiBNZXRob2QgOgorICoJMS4gUmVkdWNlIHkgdG8gcG9zaXRpdmUgYnkgYXRhbjIoeSx4KT0tYXRhbjIoLXkseCkuCisgKgkyLiBSZWR1Y2UgeCB0byBwb3NpdGl2ZSBieSAoaWYgeCBhbmQgeSBhcmUgdW5leGNlcHRpb25hbCk6IAorICoJCUFSRyAoeCtpeSkgPSBhcmN0YW4oeS94KSAgIAkgICAuLi4gaWYgeCA+IDAsCisgKgkJQVJHICh4K2l5KSA9IHBpIC0gYXJjdGFuW3kvKC14KV0gICAuLi4gaWYgeCA8IDAsCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCisgKglBVEFOMigoYW55dGhpbmcpLCBOYU4gKSBpcyBOYU47CisgKglBVEFOMihOQU4gLCAoYW55dGhpbmcpICkgaXMgTmFOOworICoJQVRBTjIoKy0wLCArKGFueXRoaW5nIGJ1dCBOYU4pKSBpcyArLTAgIDsKKyAqCUFUQU4yKCstMCwgLShhbnl0aGluZyBidXQgTmFOKSkgaXMgKy1waSA7CisgKglBVEFOMigrLShhbnl0aGluZyBidXQgMCBhbmQgTmFOKSwgMCkgaXMgKy1waS8yOworICoJQVRBTjIoKy0oYW55dGhpbmcgYnV0IElORiBhbmQgTmFOKSwgK0lORikgaXMgKy0wIDsKKyAqCUFUQU4yKCstKGFueXRoaW5nIGJ1dCBJTkYgYW5kIE5hTiksIC1JTkYpIGlzICstcGk7CisgKglBVEFOMigrLUlORiwrSU5GICkgaXMgKy1waS80IDsKKyAqCUFUQU4yKCstSU5GLC1JTkYgKSBpcyArLTNwaS80OworICoJQVRBTjIoKy1JTkYsIChhbnl0aGluZyBidXQsMCxOYU4sIGFuZCBJTkYpKSBpcyArLXBpLzI7CisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0aW55ICA9IDEuMGUtMzAwLAoremVybyAgPSAwLjAsCitwaV9vXzQgID0gNy44NTM5ODE2MzM5NzQ0ODI3OTAwRS0wMSwgLyogMHgzRkU5MjFGQiwgMHg1NDQ0MkQxOCAqLworcGlfb18yICA9IDEuNTcwNzk2MzI2Nzk0ODk2NTU4MEUrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3BpICAgICAgPSAzLjE0MTU5MjY1MzU4OTc5MzExNjBFKzAwLCAvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitwaV9sbyAgID0gMS4yMjQ2NDY3OTkxNDczNTMxNzcyRS0xNjsgLyogMHgzQ0ExQTYyNiwgMHgzMzE0NUMwNyAqLworCitkb3VibGUKK19faWVlZTc1NF9hdGFuMihkb3VibGUgeSwgZG91YmxlIHgpCit7CisJZG91YmxlIHo7CisJaW50MzJfdCBrLG0saHgsaHksaXgsaXk7CisJdV9pbnQzMl90IGx4LGx5OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CisJaWYoKChpeHwoKGx4fC1seCk+PjMxKSk+MHg3ZmYwMDAwMCl8fAorCSAgICgoaXl8KChseXwtbHkpPj4zMSkpPjB4N2ZmMDAwMDApKQkvKiB4IG9yIHkgaXMgTmFOICovCisJICAgcmV0dXJuIHgreTsKKwlpZigoaHgtMHgzZmYwMDAwMHxseCk9PTApIHJldHVybiBhdGFuKHkpOyAgIC8qIHg9MS4wICovCisJbSA9ICgoaHk+PjMxKSYxKXwoKGh4Pj4zMCkmMik7CS8qIDIqc2lnbih4KStzaWduKHkpICovCisKKyAgICAvKiB3aGVuIHkgPSAwICovCisJaWYoKGl5fGx5KT09MCkgeworCSAgICBzd2l0Y2gobSkgeworCQljYXNlIDA6IAorCQljYXNlIDE6IHJldHVybiB5OyAJLyogYXRhbigrLTAsK2FueXRoaW5nKT0rLTAgKi8KKwkJY2FzZSAyOiByZXR1cm4gIHBpK3Rpbnk7LyogYXRhbigrMCwtYW55dGhpbmcpID0gcGkgKi8KKwkJY2FzZSAzOiByZXR1cm4gLXBpLXRpbnk7LyogYXRhbigtMCwtYW55dGhpbmcpID0tcGkgKi8KKwkgICAgfQorCX0KKyAgICAvKiB3aGVuIHggPSAwICovCisJaWYoKGl4fGx4KT09MCkgcmV0dXJuIChoeTwwKT8gIC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisJICAgIAorICAgIC8qIHdoZW4geCBpcyBJTkYgKi8KKwlpZihpeD09MHg3ZmYwMDAwMCkgeworCSAgICBpZihpeT09MHg3ZmYwMDAwMCkgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHBpX29fNCt0aW55Oy8qIGF0YW4oK0lORiwrSU5GKSAqLworCQkgICAgY2FzZSAxOiByZXR1cm4gLXBpX29fNC10aW55Oy8qIGF0YW4oLUlORiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIDMuMCpwaV9vXzQrdGlueTsvKmF0YW4oK0lORiwtSU5GKSovCisJCSAgICBjYXNlIDM6IHJldHVybiAtMy4wKnBpX29fNC10aW55Oy8qYXRhbigtSU5GLC1JTkYpKi8KKwkJfQorCSAgICB9IGVsc2UgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHplcm8gIDsJLyogYXRhbigrLi4uLCtJTkYpICovCisJCSAgICBjYXNlIDE6IHJldHVybiAtemVybyAgOwkvKiBhdGFuKC0uLi4sK0lORikgKi8KKwkJICAgIGNhc2UgMjogcmV0dXJuICBwaSt0aW55ICA7CS8qIGF0YW4oKy4uLiwtSU5GKSAqLworCQkgICAgY2FzZSAzOiByZXR1cm4gLXBpLXRpbnkgIDsJLyogYXRhbigtLi4uLC1JTkYpICovCisJCX0KKwkgICAgfQorCX0KKyAgICAvKiB3aGVuIHkgaXMgSU5GICovCisJaWYoaXk9PTB4N2ZmMDAwMDApIHJldHVybiAoaHk8MCk/IC1waV9vXzItdGlueTogcGlfb18yK3Rpbnk7CisKKyAgICAvKiBjb21wdXRlIHkveCAqLworCWsgPSAoaXktaXgpPj4yMDsKKwlpZihrID4gNjApIHo9cGlfb18yKzAuNSpwaV9sbzsgCS8qIHx5L3h8ID4gIDIqKjYwICovCisJZWxzZSBpZihoeDwwJiZrPC02MCkgej0wLjA7IAkvKiB8eXwveCA8IC0yKio2MCAqLworCWVsc2Ugej1hdGFuKGZhYnMoeS94KSk7CQkvKiBzYWZlIHRvIGRvIHkveCAqLworCXN3aXRjaCAobSkgeworCSAgICBjYXNlIDA6IHJldHVybiAgICAgICB6ICA7CS8qIGF0YW4oKywrKSAqLworCSAgICBjYXNlIDE6IHsKKwkgICAgCSAgICAgIHVfaW50MzJfdCB6aDsKKwkJICAgICAgR0VUX0hJR0hfV09SRCh6aCx6KTsKKwkJICAgICAgU0VUX0hJR0hfV09SRCh6LHpoIF4gMHg4MDAwMDAwMCk7CisJCSAgICB9CisJCSAgICByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKC0sKykgKi8KKwkgICAgY2FzZSAyOiByZXR1cm4gIHBpLSh6LXBpX2xvKTsvKiBhdGFuKCssLSkgKi8KKwkgICAgZGVmYXVsdDogLyogY2FzZSAzICovCisJICAgIAkgICAgcmV0dXJuICAoei1waV9sbyktcGk7LyogYXRhbigtLC0pICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuMmYuYyBiL2xpYm0vc3JjL2VfYXRhbjJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ZDVkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfYXRhbjJmLmMKQEAgLTAsMCArMSw5NyBAQAorLyogZV9hdGFuMmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfYXRhbjIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfYXRhbjJmLmMsdiAxLjcgMjAwNC8wNi8wMiAxNzowOTowNSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordGlueSAgPSAxLjBlLTMwLAoremVybyAgPSAwLjAsCitwaV9vXzQgID0gNy44NTM5ODE4NTI1ZS0wMSwgLyogMHgzZjQ5MGZkYiAqLworcGlfb18yICA9IDEuNTcwNzk2MzcwNWUrMDAsIC8qIDB4M2ZjOTBmZGIgKi8KK3BpICAgICAgPSAzLjE0MTU5Mjc0MTBlKzAwLCAvKiAweDQwNDkwZmRiICovCitwaV9sbyAgID0gLTguNzQyMjc3NjU3M2UtMDg7IC8qIDB4YjNiYmJkMmUgKi8KKworZmxvYXQKK19faWVlZTc1NF9hdGFuMmYoZmxvYXQgeSwgZmxvYXQgeCkKK3sKKwlmbG9hdCB6OworCWludDMyX3QgayxtLGh4LGh5LGl4LGl5OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCUdFVF9GTE9BVF9XT1JEKGh5LHkpOworCWl5ID0gaHkmMHg3ZmZmZmZmZjsKKwlpZigoaXg+MHg3ZjgwMDAwMCl8fAorCSAgIChpeT4weDdmODAwMDAwKSkJLyogeCBvciB5IGlzIE5hTiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoaHg9PTB4M2Y4MDAwMDApIHJldHVybiBhdGFuZih5KTsgICAvKiB4PTEuMCAqLworCW0gPSAoKGh5Pj4zMSkmMSl8KChoeD4+MzApJjIpOwkvKiAyKnNpZ24oeCkrc2lnbih5KSAqLworCisgICAgLyogd2hlbiB5ID0gMCAqLworCWlmKGl5PT0wKSB7CisJICAgIHN3aXRjaChtKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOiByZXR1cm4geTsgCS8qIGF0YW4oKy0wLCthbnl0aGluZyk9Ky0wICovCisJCWNhc2UgMjogcmV0dXJuICBwaSt0aW55Oy8qIGF0YW4oKzAsLWFueXRoaW5nKSA9IHBpICovCisJCWNhc2UgMzogcmV0dXJuIC1waS10aW55Oy8qIGF0YW4oLTAsLWFueXRoaW5nKSA9LXBpICovCisJICAgIH0KKwl9CisgICAgLyogd2hlbiB4ID0gMCAqLworCWlmKGl4PT0wKSByZXR1cm4gKGh5PDApPyAgLXBpX29fMi10aW55OiBwaV9vXzIrdGlueTsKKworICAgIC8qIHdoZW4geCBpcyBJTkYgKi8KKwlpZihpeD09MHg3ZjgwMDAwMCkgeworCSAgICBpZihpeT09MHg3ZjgwMDAwMCkgeworCQlzd2l0Y2gobSkgeworCQkgICAgY2FzZSAwOiByZXR1cm4gIHBpX29fNCt0aW55Oy8qIGF0YW4oK0lORiwrSU5GKSAqLworCQkgICAgY2FzZSAxOiByZXR1cm4gLXBpX29fNC10aW55Oy8qIGF0YW4oLUlORiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIChmbG9hdCkzLjAqcGlfb180K3Rpbnk7LyphdGFuKCtJTkYsLUlORikqLworCQkgICAgY2FzZSAzOiByZXR1cm4gKGZsb2F0KS0zLjAqcGlfb180LXRpbnk7LyphdGFuKC1JTkYsLUlORikqLworCQl9CisJICAgIH0gZWxzZSB7CisJCXN3aXRjaChtKSB7CisJCSAgICBjYXNlIDA6IHJldHVybiAgemVybyAgOwkvKiBhdGFuKCsuLi4sK0lORikgKi8KKwkJICAgIGNhc2UgMTogcmV0dXJuIC16ZXJvICA7CS8qIGF0YW4oLS4uLiwrSU5GKSAqLworCQkgICAgY2FzZSAyOiByZXR1cm4gIHBpK3RpbnkgIDsJLyogYXRhbigrLi4uLC1JTkYpICovCisJCSAgICBjYXNlIDM6IHJldHVybiAtcGktdGlueSAgOwkvKiBhdGFuKC0uLi4sLUlORikgKi8KKwkJfQorCSAgICB9CisJfQorICAgIC8qIHdoZW4geSBpcyBJTkYgKi8KKwlpZihpeT09MHg3ZjgwMDAwMCkgcmV0dXJuIChoeTwwKT8gLXBpX29fMi10aW55OiBwaV9vXzIrdGlueTsKKworICAgIC8qIGNvbXB1dGUgeS94ICovCisJayA9IChpeS1peCk+PjIzOworCWlmKGsgPiA2MCkgej1waV9vXzIrKGZsb2F0KTAuNSpwaV9sbzsgCS8qIHx5L3h8ID4gIDIqKjYwICovCisJZWxzZSBpZihoeDwwJiZrPC02MCkgej0wLjA7IAkvKiB8eXwveCA8IC0yKio2MCAqLworCWVsc2Ugej1hdGFuZihmYWJzZih5L3gpKTsJLyogc2FmZSB0byBkbyB5L3ggKi8KKwlzd2l0Y2ggKG0pIHsKKwkgICAgY2FzZSAwOiByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKCssKykgKi8KKwkgICAgY2FzZSAxOiB7CisJICAgIAkgICAgICB1X2ludDMyX3Qgemg7CisJCSAgICAgIEdFVF9GTE9BVF9XT1JEKHpoLHopOworCQkgICAgICBTRVRfRkxPQVRfV09SRCh6LHpoIF4gMHg4MDAwMDAwMCk7CisJCSAgICB9CisJCSAgICByZXR1cm4gICAgICAgeiAgOwkvKiBhdGFuKC0sKykgKi8KKwkgICAgY2FzZSAyOiByZXR1cm4gIHBpLSh6LXBpX2xvKTsvKiBhdGFuKCssLSkgKi8KKwkgICAgZGVmYXVsdDogLyogY2FzZSAzICovCisJICAgIAkgICAgcmV0dXJuICAoei1waV9sbyktcGk7LyogYXRhbigtLC0pICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9hdGFuaC5jIGIvbGlibS9zcmMvZV9hdGFuaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDg3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW5oLmMKQEAgLTAsMCArMSw2MyBAQAorCisvKiBAKCMpZV9hdGFuaC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9hdGFuaC5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfYXRhbmgoeCkKKyAqIE1ldGhvZCA6CisgKiAgICAxLlJlZHVjZWQgeCB0byBwb3NpdGl2ZSBieSBhdGFuaCgteCkgPSAtYXRhbmgoeCkKKyAqICAgIDIuRm9yIHg+PTAuNQorICogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAyeCAgICAgICAgICAgICAgICAgICAgICAgICAgeAorICoJYXRhbmgoeCkgPSAtLS0gKiBsb2coMSArIC0tLS0tLS0pID0gMC41ICogbG9nMXAoMiAqIC0tLS0tLS0tKQorICogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgIDEgLSB4ICAgICAgICAgICAgICAgICAgICAgIDEgLSB4CisgKgkKKyAqIAlGb3IgeDwwLjUKKyAqCWF0YW5oKHgpID0gMC41KmxvZzFwKDJ4KzJ4KngvKDEteCkpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWF0YW5oKHgpIGlzIE5hTiBpZiB8eHwgPiAxIHdpdGggc2lnbmFsOworICoJYXRhbmgoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbDsKKyAqCWF0YW5oKCstMSkgaXMgKy1JTkYgd2l0aCBzaWduYWwuCisgKgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgb25lID0gMS4wLCBodWdlID0gMWUzMDA7CitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gPSAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2F0YW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0OworCWludDMyX3QgaHgsaXg7CisJdV9pbnQzMl90IGx4OworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmICgoaXh8KChseHwoLWx4KSk+PjMxKSk+MHgzZmYwMDAwMCkgLyogfHh8PjEgKi8KKwkgICAgcmV0dXJuICh4LXgpLyh4LXgpOworCWlmKGl4PT0weDNmZjAwMDAwKSAKKwkgICAgcmV0dXJuIHgvemVybzsKKwlpZihpeDwweDNlMzAwMDAwJiYoaHVnZSt4KT56ZXJvKSByZXR1cm4geDsJLyogeDwyKiotMjggKi8KKwlTRVRfSElHSF9XT1JEKHgsaXgpOworCWlmKGl4PDB4M2ZlMDAwMDApIHsJCS8qIHggPCAwLjUgKi8KKwkgICAgdCA9IHgreDsKKwkgICAgdCA9IDAuNSpsb2cxcCh0K3QqeC8ob25lLXgpKTsKKwl9IGVsc2UgCisJICAgIHQgPSAwLjUqbG9nMXAoKHgreCkvKG9uZS14KSk7CisJaWYoaHg+PTApIHJldHVybiB0OyBlbHNlIHJldHVybiAtdDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfYXRhbmhmLmMgYi9saWJtL3NyYy9lX2F0YW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWJkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2F0YW5oZi5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGVfYXRhbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2F0YW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2F0YW5oZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBodWdlID0gMWUzMDsKKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfYXRhbmhmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKwlpbnQzMl90IGh4LGl4OworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZiAoaXg+MHgzZjgwMDAwMCkgCQkvKiB8eHw+MSAqLworCSAgICByZXR1cm4gKHgteCkvKHgteCk7CisJaWYoaXg9PTB4M2Y4MDAwMDApCisJICAgIHJldHVybiB4L3plcm87CisJaWYoaXg8MHgzMTgwMDAwMCYmKGh1Z2UreCk+emVybykgcmV0dXJuIHg7CS8qIHg8MioqLTI4ICovCisJU0VUX0ZMT0FUX1dPUkQoeCxpeCk7CisJaWYoaXg8MHgzZjAwMDAwMCkgewkJLyogeCA8IDAuNSAqLworCSAgICB0ID0geCt4OworCSAgICB0ID0gKGZsb2F0KTAuNSpsb2cxcGYodCt0KngvKG9uZS14KSk7CisJfSBlbHNlCisJICAgIHQgPSAoZmxvYXQpMC41KmxvZzFwZigoeCt4KS8ob25lLXgpKTsKKwlpZihoeD49MCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIC10OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9jb3NoLmMgYi9saWJtL3NyYy9lX2Nvc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9jb3NoLmMKQEAgLTAsMCArMSw4NiBAQAorCisvKiBAKCMpZV9jb3NoLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfY29zaC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfY29zaCh4KQorICogTWV0aG9kIDogCisgKiBtYXRoZW1hdGljYWxseSBjb3NoKHgpIGlmIGRlZmluZWQgdG8gYmUgKGV4cCh4KStleHAoLXgpKS8yCisgKgkxLiBSZXBsYWNlIHggYnkgfHh8IChjb3NoKHgpID0gY29zaCgteCkpLiAKKyAqCTIuIAorICoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGV4cCh4KSAtIDEgXV4yIAorICoJICAgIDAgICAgICAgIDw9IHggPD0gbG4yLzIgIDogIGNvc2goeCkgOj0gMSArIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkJICAgICAgIAkJCSAgICAgICAgICAgMipleHAoeCkKKyAqCisgKgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cCh4KSArICAxL2V4cCh4KQorICoJICAgIGxuMi8yICAgIDw9IHggPD0gMjIgICAgIDogIGNvc2goeCkgOj0gLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCQkgICAgICAgCQkJICAgICAgICAgIDIKKyAqCSAgICAyMiAgICAgICA8PSB4IDw9IGxub3ZmdCA6ICBjb3NoKHgpIDo9IGV4cCh4KS8yIAorICoJICAgIGxub3ZmdCAgIDw9IHggPD0gbG4yb3ZmdDogIGNvc2goeCkgOj0gZXhwKHgvMikvMiAqIGV4cCh4LzIpCisgKgkgICAgbG4yb3ZmdCAgPCAgeAkgICAgOiAgY29zaCh4KSA6PSBodWdlKmh1Z2UgKG92ZXJmbG93KQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKgljb3NoKHgpIGlzIHx4fCBpZiB4IGlzICtJTkYsIC1JTkYsIG9yIE5hTi4KKyAqCW9ubHkgY29zaCgwKT0xIGlzIGV4YWN0IGZvciBmaW5pdGUgeC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgaGFsZj0wLjUsIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK19faWVlZTc1NF9jb3NoKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHc7CisJaW50MzJfdCBpeDsKKwl1X2ludDMyX3QgbHg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OwkKKworICAgIC8qIHx4fCBpbiBbMCwwLjUqbG4yXSwgcmV0dXJuIDErZXhwbTEofHh8KV4yLygyKmV4cCh8eHwpKSAqLworCWlmKGl4PDB4M2ZkNjJlNDMpIHsKKwkgICAgdCA9IGV4cG0xKGZhYnMoeCkpOworCSAgICB3ID0gb25lK3Q7CisJICAgIGlmIChpeDwweDNjODAwMDAwKSByZXR1cm4gdzsJLyogY29zaCh0aW55KSA9IDEgKi8KKwkgICAgcmV0dXJuIG9uZSsodCp0KS8odyt3KTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzAuNSpsbjIsMjJdLCByZXR1cm4gKGV4cCh8eHwpKzEvZXhwKHx4fCkvMjsgKi8KKwlpZiAoaXggPCAweDQwMzYwMDAwKSB7CisJCXQgPSBfX2llZWU3NTRfZXhwKGZhYnMoeCkpOworCQlyZXR1cm4gaGFsZip0K2hhbGYvdDsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzIyLCBsb2cobWF4ZG91YmxlKV0gcmV0dXJuIGhhbGYqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQwODYyRTQyKSAgcmV0dXJuIGhhbGYqX19pZWVlNzU0X2V4cChmYWJzKHgpKTsKKworICAgIC8qIHx4fCBpbiBbbG9nKG1heGRvdWJsZSksIG92ZXJmbG93dGhyZXNvbGRdICovCisJR0VUX0xPV19XT1JEKGx4LHgpOworCWlmIChpeDwweDQwODYzM0NFIHx8CisJICAgICAgKChpeD09MHg0MDg2MzNjZSkmJihseDw9KHVfaW50MzJfdCkweDhmYjlmODdkKSkpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHAoaGFsZipmYWJzKHgpKTsKKwkgICAgdCA9IGhhbGYqdzsKKwkgICAgcmV0dXJuIHQqdzsKKwl9CisKKyAgICAvKiB8eHwgPiBvdmVyZmxvd3RocmVzb2xkLCBjb3NoKHgpIG92ZXJmbG93ICovCisJcmV0dXJuIGh1Z2UqaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfY29zaGYuYyBiL2xpYm0vc3JjL2VfY29zaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWRmOWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9jb3NoZi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIGVfY29zaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfY29zaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9jb3NoZi5jLHYgMS43IDIwMDUvMTEvMTMgMDA6MDg6MjMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBoYWxmPTAuNSwgaHVnZSA9IDEuMGUzMDsKKworZmxvYXQKK19faWVlZTc1NF9jb3NoZihmbG9hdCB4KQoreworCWZsb2F0IHQsdzsKKwlpbnQzMl90IGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geCp4OworCisgICAgLyogfHh8IGluIFswLDAuNSpsbjJdLCByZXR1cm4gMStleHBtMSh8eHwpXjIvKDIqZXhwKHx4fCkpICovCisJaWYoaXg8MHgzZWIxNzIxOCkgeworCSAgICB0ID0gZXhwbTFmKGZhYnNmKHgpKTsKKwkgICAgdyA9IG9uZSt0OworCSAgICBpZiAoaXg8MHgzOTgwMDAwMCkgcmV0dXJuIG9uZTsJLyogY29zaCh0aW55KSA9IDEgKi8KKwkgICAgcmV0dXJuIG9uZSsodCp0KS8odyt3KTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzAuNSpsbjIsOV0sIHJldHVybiAoZXhwKHx4fCkrMS9leHAofHh8KSkvMjsgKi8KKwlpZiAoaXggPCAweDQxMTAwMDAwKSB7CisJCXQgPSBfX2llZWU3NTRfZXhwZihmYWJzZih4KSk7CisJCXJldHVybiBoYWxmKnQraGFsZi90OworCX0KKworICAgIC8qIHx4fCBpbiBbOSwgbG9nKG1heGZsb2F0KV0gcmV0dXJuIGhhbGYqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQyYjE3MjE3KSAgcmV0dXJuIGhhbGYqX19pZWVlNzU0X2V4cGYoZmFic2YoeCkpOworCisgICAgLyogfHh8IGluIFtsb2cobWF4ZmxvYXQpLCBvdmVyZmxvd3RocmVzb2xkXSAqLworCWlmIChpeDw9MHg0MmIyZDRmYykgeworCSAgICB3ID0gX19pZWVlNzU0X2V4cGYoaGFsZipmYWJzZih4KSk7CisJICAgIHQgPSBoYWxmKnc7CisJICAgIHJldHVybiB0Knc7CisJfQorCisgICAgLyogfHh8ID4gb3ZlcmZsb3d0aHJlc29sZCwgY29zaCh4KSBvdmVyZmxvdyAqLworCXJldHVybiBodWdlKmh1Z2U7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2V4cC5jIGIvbGlibS9zcmMvZV9leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjYxODk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9leHAuYwpAQCAtMCwwICsxLDE1OSBAQAorCisvKiBAKCMpZV9leHAuYyAxLjYgMDQvMDQvMjIgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2V4cC5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA1IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2V4cCh4KQorICogUmV0dXJucyB0aGUgZXhwb25lbnRpYWwgb2YgeC4KKyAqCisgKiBNZXRob2QKKyAqICAgMS4gQXJndW1lbnQgcmVkdWN0aW9uOgorICogICAgICBSZWR1Y2UgeCB0byBhbiByIHNvIHRoYXQgfHJ8IDw9IDAuNSpsbjIgfiAwLjM0NjU4LgorICoJR2l2ZW4geCwgZmluZCByIGFuZCBpbnRlZ2VyIGsgc3VjaCB0aGF0CisgKgorICogICAgICAgICAgICAgICB4ID0gaypsbjIgKyByLCAgfHJ8IDw9IDAuNSpsbjIuICAKKyAqCisgKiAgICAgIEhlcmUgciB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIHIgPSBoaS1sbyBmb3IgYmV0dGVyIAorICoJYWNjdXJhY3kuCisgKgorICogICAyLiBBcHByb3hpbWF0aW9uIG9mIGV4cChyKSBieSBhIHNwZWNpYWwgcmF0aW9uYWwgZnVuY3Rpb24gb24KKyAqCXRoZSBpbnRlcnZhbCBbMCwwLjM0NjU4XToKKyAqCVdyaXRlCisgKgkgICAgUihyKioyKSA9IHIqKGV4cChyKSsxKS8oZXhwKHIpLTEpID0gMiArIHIqci82IC0gcioqNC8zNjAgKyAuLi4KKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lcyBhbGdvcml0aG0gb24gWzAsMC4zNDY1OF0gdG8gZ2VuZXJhdGUgCisgKiAJYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSA1IHRvIGFwcHJveGltYXRlIFIuIFRoZSBtYXhpbXVtIGVycm9yIAorICoJb2YgdGhpcyBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gaXMgYm91bmRlZCBieSAyKiotNTkuIEluCisgKglvdGhlciB3b3JkcywKKyAqCSAgICBSKHopIH4gMi4wICsgUDEqeiArIFAyKnoqKjIgKyBQMyp6KiozICsgUDQqeioqNCArIFA1KnoqKjUKKyAqICAJKHdoZXJlIHo9cipyLCBhbmQgdGhlIHZhbHVlcyBvZiBQMSB0byBQNSBhcmUgbGlzdGVkIGJlbG93KQorICoJYW5kCisgKgkgICAgfCAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgfCAgICAgLTU5CisgKgkgICAgfCAyLjArUDEqeisuLi4rUDUqeiAgIC0gIFIoeikgfCA8PSAyIAorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCVRoZSBjb21wdXRhdGlvbiBvZiBleHAocikgdGh1cyBiZWNvbWVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipyCisgKgkJZXhwKHIpID0gMSArIC0tLS0tLS0KKyAqCQkgICAgICAgICAgICAgIFIgLSByCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIqUjEocikJCisgKgkJICAgICAgID0gMSArIHIgKyAtLS0tLS0tLS0tLSAoZm9yIGJldHRlciBhY2N1cmFjeSkKKyAqCQkgICAgICAgICAgICAgICAgICAyIC0gUjEocikKKyAqCXdoZXJlCisgKgkJCSAgICAgICAgIDIgICAgICAgNCAgICAgICAgICAgICAxMAorICoJCVIxKHIpID0gciAtIChQMSpyICArIFAyKnIgICsgLi4uICsgUDUqciAgICkuCisgKgkKKyAqICAgMy4gU2NhbGUgYmFjayB0byBvYnRhaW4gZXhwKHgpOgorICoJRnJvbSBzdGVwIDEsIHdlIGhhdmUKKyAqCSAgIGV4cCh4KSA9IDJeayAqIGV4cChyKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglleHAoSU5GKSBpcyBJTkYsIGV4cChOYU4pIGlzIE5hTjsKKyAqCWV4cCgtSU5GKSBpcyAwLCBhbmQKKyAqCWZvciBmaW5pdGUgYXJndW1lbnQsIG9ubHkgZXhwKDApPTEgaXMgZXhhY3QuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogTWlzYy4gaW5mby4KKyAqCUZvciBJRUVFIGRvdWJsZSAKKyAqCSAgICBpZiB4ID4gIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyIHRoZW4gZXhwKHgpIG92ZXJmbG93CisgKgkgICAgaWYgeCA8IC03LjQ1MTMzMjE5MTAxOTQxMTA4NDIwZSswMiB0aGVuIGV4cCh4KSB1bmRlcmZsb3cKKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZyAKKyAqIGNvbnN0YW50cy4gVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSAKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lCT0gMS4wLAoraGFsRlsyXQk9IHswLjUsLTAuNSx9LAoraHVnZQk9IDEuMGUrMzAwLAordHdvbTEwMDA9IDkuMzMyNjM2MTg1MDMyMTg4Nzg5OTBlLTMwMiwgICAgIC8qIDIqKi0xMDAwPTB4MDE3MDAwMDAsMCovCitvX3RocmVzaG9sZD0gIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyLCAgLyogMHg0MDg2MkU0MiwgMHhGRUZBMzlFRiAqLwordV90aHJlc2hvbGQ9IC03LjQ1MTMzMjE5MTAxOTQxMTA4NDIwZSswMiwgIC8qIDB4YzA4NzQ5MTAsIDB4RDUyRDMwNTEgKi8KK2xuMkhJWzJdICAgPXsgNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsICAvKiAweDNmZTYyZTQyLCAweGZlZTAwMDAwICovCisJICAgICAtNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsfSwvKiAweGJmZTYyZTQyLCAweGZlZTAwMDAwICovCitsbjJMT1syXSAgID17IDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLCAgLyogMHgzZGVhMzllZiwgMHgzNTc5M2M3NiAqLworCSAgICAgLTEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLH0sLyogMHhiZGVhMzllZiwgMHgzNTc5M2M3NiAqLworaW52bG4yID0gIDEuNDQyNjk1MDQwODg4OTYzMzg3MDBlKzAwLCAvKiAweDNmZjcxNTQ3LCAweDY1MmI4MmZlICovCitQMSAgID0gIDEuNjY2NjY2NjY2NjY2NjYwMTkwMzdlLTAxLCAvKiAweDNGQzU1NTU1LCAweDU1NTU1NTNFICovCitQMiAgID0gLTIuNzc3Nzc3Nzc3NzAxNTU5MzM4NDJlLTAzLCAvKiAweEJGNjZDMTZDLCAweDE2QkVCRDkzICovCitQMyAgID0gIDYuNjEzNzU2MzIxNDM3OTM0MzYxMTdlLTA1LCAvKiAweDNGMTE1NjZBLCAweEFGMjVERTJDICovCitQNCAgID0gLTEuNjUzMzkwMjIwNTQ2NTI1MTUzOTBlLTA2LCAvKiAweEJFQkJCRDQxLCAweEM1RDI2QkYxICovCitQNSAgID0gIDQuMTM4MTM2Nzk3MDU3MjM4NDYwMzllLTA4OyAvKiAweDNFNjYzNzY5LCAweDcyQkVBNEQwICovCisKKworZG91YmxlCitfX2llZWU3NTRfZXhwKGRvdWJsZSB4KQkvKiBkZWZhdWx0IElFRUUgZG91YmxlIGV4cCAqLworeworCWRvdWJsZSB5LGhpPTAuMCxsbz0wLjAsYyx0OworCWludDMyX3Qgaz0wLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCXhzYiA9IChoeD4+MzEpJjE7CQkvKiBzaWduIGJpdCBvZiB4ICovCisJaHggJj0gMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKworICAgIC8qIGZpbHRlciBvdXQgbm9uLWZpbml0ZSBhcmd1bWVudCAqLworCWlmKGh4ID49IDB4NDA4NjJFNDIpIHsJCQkvKiBpZiB8eHw+PTcwOS43OC4uLiAqLworICAgICAgICAgICAgaWYoaHg+PTB4N2ZmMDAwMDApIHsKKwkgICAgICAgIHVfaW50MzJfdCBseDsKKwkJR0VUX0xPV19XT1JEKGx4LHgpOworCQlpZigoKGh4JjB4ZmZmZmYpfGx4KSE9MCkKKwkJICAgICByZXR1cm4geCt4OyAJCS8qIE5hTiAqLworCQllbHNlIHJldHVybiAoeHNiPT0wKT8geDowLjA7CS8qIGV4cCgrLWluZik9e2luZiwwfSAqLworCSAgICB9CisJICAgIGlmKHggPiBvX3RocmVzaG9sZCkgcmV0dXJuIGh1Z2UqaHVnZTsgLyogb3ZlcmZsb3cgKi8KKwkgICAgaWYoeCA8IHVfdGhyZXNob2xkKSByZXR1cm4gdHdvbTEwMDAqdHdvbTEwMDA7IC8qIHVuZGVyZmxvdyAqLworCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZmQ2MmU0MikgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8gCisJICAgIGlmKGh4IDwgMHgzRkYwQTJCMikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQloaSA9IHgtbG4ySElbeHNiXTsgbG89bG4yTE9beHNiXTsgayA9IDEteHNiLXhzYjsKKwkgICAgfSBlbHNlIHsKKwkJayAgPSAoaW50KShpbnZsbjIqeCtoYWxGW3hzYl0pOworCQl0ICA9IGs7CisJCWhpID0geCAtIHQqbG4ySElbMF07CS8qIHQqbG4ySEkgaXMgZXhhY3QgaGVyZSAqLworCQlsbyA9IHQqbG4yTE9bMF07CisJICAgIH0KKwkgICAgeCAgPSBoaSAtIGxvOworCX0gCisJZWxzZSBpZihoeCA8IDB4M2UzMDAwMDApICB7CS8qIHdoZW4gfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gb25lK3g7LyogdHJpZ2dlciBpbmV4YWN0ICovCisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJdCAgPSB4Kng7CisJYyAgPSB4IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJaWYoaz09MCkgCXJldHVybiBvbmUtKCh4KmMpLyhjLTIuMCkteCk7IAorCWVsc2UgCQl5ID0gb25lLSgobG8tKHgqYykvKDIuMC1jKSktaGkpOworCWlmKGsgPj0gLTEwMjEpIHsKKwkgICAgdV9pbnQzMl90IGh5OworCSAgICBHRVRfSElHSF9XT1JEKGh5LHkpOworCSAgICBTRVRfSElHSF9XT1JEKHksaHkrKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geTsKKwl9IGVsc2UgeworCSAgICB1X2ludDMyX3QgaHk7CisJICAgIEdFVF9ISUdIX1dPUkQoaHkseSk7CisJICAgIFNFVF9ISUdIX1dPUkQoeSxoeSsoKGsrMTAwMCk8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geSp0d29tMTAwMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2V4cGYuYyBiL2xpYm0vc3JjL2VfZXhwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDY1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2V4cGYuYwpAQCAtMCwwICsxLDk1IEBACisvKiBlX2V4cGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfZXhwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2V4cGYuYyx2IDEuMTAgMjAwNS8xMS8zMCAwNDo1Njo0OSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorb25lCT0gMS4wLAoraGFsRlsyXQk9IHswLjUsLTAuNSx9LAoraHVnZQk9IDEuMGUrMzAsCit0d29tMTAwID0gNy44ODg2MDkwNTIyZS0zMSwgICAgICAvKiAyKiotMTAwPTB4MGQ4MDAwMDAgKi8KK29fdGhyZXNob2xkPSAgOC44NzIxNjc5Njg4ZSswMSwgIC8qIDB4NDJiMTcxODAgKi8KK3VfdGhyZXNob2xkPSAtMS4wMzk3MjA4NDA1ZSswMiwgIC8qIDB4YzJjZmYxYjUgKi8KK2xuMkhJWzJdICAgPXsgNi45MzE0NTc1MTk1ZS0wMSwJCS8qIDB4M2YzMTcyMDAgKi8KKwkgICAgIC02LjkzMTQ1NzUxOTVlLTAxLH0sCS8qIDB4YmYzMTcyMDAgKi8KK2xuMkxPWzJdICAgPXsgMS40Mjg2MDY3NjUzZS0wNiwgIAkvKiAweDM1YmZiZThlICovCisJICAgICAtMS40Mjg2MDY3NjUzZS0wNix9LAkvKiAweGI1YmZiZThlICovCitpbnZsbjIgPSAgMS40NDI2OTUwMjE2ZSswMCwgCQkvKiAweDNmYjhhYTNiICovCitQMSAgID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK1AyICAgPSAtMi43Nzc3Nzc4NDUwZS0wMywgLyogMHhiYjM2MGI2MSAqLworUDMgICA9ICA2LjYxMzc1NTk3NzBlLTA1LCAvKiAweDM4OGFiMzU1ICovCitQNCAgID0gLTEuNjUzMzkwMTk5OWUtMDYsIC8qIDB4YjVkZGVhMGUgKi8KK1A1ICAgPSAgNC4xMzgxMzY5NDQyZS0wODsgLyogMHgzMzMxYmI0YyAqLworCitmbG9hdAorX19pZWVlNzU0X2V4cGYoZmxvYXQgeCkJLyogZGVmYXVsdCBJRUVFIGRvdWJsZSBleHAgKi8KK3sKKwlmbG9hdCB5LGhpPTAuMCxsbz0wLjAsYyx0OworCWludDMyX3Qgaz0wLHhzYjsKKwl1X2ludDMyX3QgaHg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwl4c2IgPSAoaHg+PjMxKSYxOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQyYjE3MjE4KSB7CQkJLyogaWYgfHh8Pj04OC43MjEuLi4gKi8KKwkgICAgaWYoaHg+MHg3ZjgwMDAwMCkKKwkJIHJldHVybiB4K3g7CSAJCS8qIE5hTiAqLworICAgICAgICAgICAgaWYoaHg9PTB4N2Y4MDAwMDApCisJCXJldHVybiAoeHNiPT0wKT8geDowLjA7CQkvKiBleHAoKy1pbmYpPXtpbmYsMH0gKi8KKwkgICAgaWYoeCA+IG9fdGhyZXNob2xkKSByZXR1cm4gaHVnZSpodWdlOyAvKiBvdmVyZmxvdyAqLworCSAgICBpZih4IDwgdV90aHJlc2hvbGQpIHJldHVybiB0d29tMTAwKnR3b20xMDA7IC8qIHVuZGVyZmxvdyAqLworCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZWIxNzIxOCkgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8KKwkgICAgaWYoaHggPCAweDNGODUxNTkyKSB7CS8qIGFuZCB8eHwgPCAxLjUgbG4yICovCisJCWhpID0geC1sbjJISVt4c2JdOyBsbz1sbjJMT1t4c2JdOyBrID0gMS14c2IteHNiOworCSAgICB9IGVsc2UgeworCQlrICA9IGludmxuMip4K2hhbEZbeHNiXTsKKwkJdCAgPSBrOworCQloaSA9IHggLSB0KmxuMkhJWzBdOwkvKiB0KmxuMkhJIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMkxPWzBdOworCSAgICB9CisJICAgIHggID0gaGkgLSBsbzsKKwl9CisJZWxzZSBpZihoeCA8IDB4MzE4MDAwMDApICB7CS8qIHdoZW4gfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gb25lK3g7LyogdHJpZ2dlciBpbmV4YWN0ICovCisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJdCAgPSB4Kng7CisJYyAgPSB4IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJaWYoaz09MCkgCXJldHVybiBvbmUtKCh4KmMpLyhjLShmbG9hdCkyLjApLXgpOworCWVsc2UgCQl5ID0gb25lLSgobG8tKHgqYykvKChmbG9hdCkyLjAtYykpLWhpKTsKKwlpZihrID49IC0xMjUpIHsKKwkgICAgdV9pbnQzMl90IGh5OworCSAgICBHRVRfRkxPQVRfV09SRChoeSx5KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeSxoeSsoazw8MjMpKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgIHJldHVybiB5OworCX0gZWxzZSB7CisJICAgIHVfaW50MzJfdCBoeTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJICAgIFNFVF9GTE9BVF9XT1JEKHksaHkrKChrKzEwMCk8PDIzKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICByZXR1cm4geSp0d29tMTAwOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfZm1vZC5jIGIvbGlibS9zcmMvZV9mbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzE2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZm1vZC5jCkBAIC0wLDAgKzEsMTMzIEBACisKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9mbW9kLmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIAorICogX19pZWVlNzU0X2Ztb2QoeCx5KQorICogUmV0dXJuIHggbW9kIHkgaW4gZXhhY3QgYXJpdGhtZXRpYworICogTWV0aG9kOiBzaGlmdCBhbmQgc3VidHJhY3QKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMCwgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCitkb3VibGUKK19faWVlZTc1NF9mbW9kKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwlpbnQzMl90IG4saHgsaHksaHosaXgsaXksc3gsaTsKKwl1X2ludDMyX3QgbHgsbHksbHo7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJc3ggPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBvZiB4ICovCisJaHggXj1zeDsJCS8qIHx4fCAqLworCWh5ICY9IDB4N2ZmZmZmZmY7CS8qIHx5fCAqLworCisgICAgLyogcHVyZ2Ugb2ZmIGV4Y2VwdGlvbiB2YWx1ZXMgKi8KKwlpZigoaHl8bHkpPT0wfHwoaHg+PTB4N2ZmMDAwMDApfHwJLyogeT0wLG9yIHggbm90IGZpbml0ZSAqLworCSAgKChoeXwoKGx5fC1seSk+PjMxKSk+MHg3ZmYwMDAwMCkpCS8qIG9yIHkgaXMgTmFOICovCisJICAgIHJldHVybiAoeCp5KS8oeCp5KTsKKwlpZihoeDw9aHkpIHsKKwkgICAgaWYoKGh4PGh5KXx8KGx4PGx5KSkgcmV0dXJuIHg7CS8qIHx4fDx8eXwgcmV0dXJuIHggKi8KKwkgICAgaWYobHg9PWx5KSAKKwkJcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCX0KKworICAgIC8qIGRldGVybWluZSBpeCA9IGlsb2diKHgpICovCisJaWYoaHg8MHgwMDEwMDAwMCkgewkvKiBzdWJub3JtYWwgeCAqLworCSAgICBpZihoeD09MCkgeworCQlmb3IgKGl4ID0gLTEwNDMsIGk9bHg7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpeCA9IC0xMDIyLGk9KGh4PDwxMSk7IGk+MDsgaTw8PTEpIGl4IC09MTsKKwkgICAgfQorCX0gZWxzZSBpeCA9IChoeD4+MjApLTEwMjM7CisKKyAgICAvKiBkZXRlcm1pbmUgaXkgPSBpbG9nYih5KSAqLworCWlmKGh5PDB4MDAxMDAwMDApIHsJLyogc3Vibm9ybWFsIHkgKi8KKwkgICAgaWYoaHk9PTApIHsKKwkJZm9yIChpeSA9IC0xMDQzLCBpPWx5OyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0gZWxzZSB7CisJCWZvciAoaXkgPSAtMTAyMixpPShoeTw8MTEpOyBpPjA7IGk8PD0xKSBpeSAtPTE7CisJICAgIH0KKwl9IGVsc2UgaXkgPSAoaHk+PjIwKS0xMDIzOworCisgICAgLyogc2V0IHVwIHtoeCxseH0sIHtoeSxseX0gYW5kIGFsaWduIHkgdG8geCAqLworCWlmKGl4ID49IC0xMDIyKSAKKwkgICAgaHggPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXg7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeCA9IChoeDw8bil8KGx4Pj4oMzItbikpOworCSAgICAgICAgbHggPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh4ID0gbHg8PChuLTMyKTsKKwkJbHggPSAwOworCSAgICB9CisJfQorCWlmKGl5ID49IC0xMDIyKSAKKwkgICAgaHkgPSAweDAwMTAwMDAwfCgweDAwMGZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEwMjItaXk7CisJICAgIGlmKG48PTMxKSB7CisJICAgICAgICBoeSA9IChoeTw8bil8KGx5Pj4oMzItbikpOworCSAgICAgICAgbHkgPDw9IG47CisJICAgIH0gZWxzZSB7CisJCWh5ID0gbHk8PChuLTMyKTsKKwkJbHkgPSAwOworCSAgICB9CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCSAgICBpZihoejwwKXtoeCA9IGh4K2h4KyhseD4+MzEpOyBseCA9IGx4K2x4O30KKwkgICAgZWxzZSB7CisJICAgIAlpZigoaHp8bHopPT0wKSAJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwkgICAgCWh4ID0gaHoraHorKGx6Pj4zMSk7IGx4ID0gbHorbHo7CisJICAgIH0KKwl9CisJaHo9aHgtaHk7bHo9bHgtbHk7IGlmKGx4PGx5KSBoeiAtPSAxOworCWlmKGh6Pj0wKSB7aHg9aHo7bHg9bHo7fQorCisgICAgLyogY29udmVydCBiYWNrIHRvIGZsb2F0aW5nIHZhbHVlIGFuZCByZXN0b3JlIHRoZSBzaWduICovCisJaWYoKGh4fGx4KT09MCkgCQkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJd2hpbGUoaHg8MHgwMDEwMDAwMCkgewkJLyogbm9ybWFsaXplIHggKi8KKwkgICAgaHggPSBoeCtoeCsobHg+PjMxKTsgbHggPSBseCtseDsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTAyMikgewkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwMTAwMDAwKXwoKGl5KzEwMjMpPDwyMCkpOworCSAgICBJTlNFUlRfV09SRFMoeCxoeHxzeCxseCk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMDIyIC0gaXk7CisJICAgIGlmKG48PTIwKSB7CisJCWx4ID0gKGx4Pj5uKXwoKHVfaW50MzJfdCloeDw8KDMyLW4pKTsKKwkJaHggPj49IG47CisJICAgIH0gZWxzZSBpZiAobjw9MzEpIHsKKwkJbHggPSAoaHg8PCgzMi1uKSl8KGx4Pj5uKTsgaHggPSBzeDsKKwkgICAgfSBlbHNlIHsKKwkJbHggPSBoeD4+KG4tMzIpOyBoeCA9IHN4OworCSAgICB9CisJICAgIElOU0VSVF9XT1JEUyh4LGh4fHN4LGx4KTsKKwkgICAgeCAqPSBvbmU7CQkvKiBjcmVhdGUgbmVjZXNzYXJ5IHNpZ25hbCAqLworCX0KKwlyZXR1cm4geDsJCS8qIGV4YWN0IG91dHB1dCAqLworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9mbW9kZi5jIGIvbGlibS9zcmMvZV9mbW9kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDg3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2Ztb2RmLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIGVfZm1vZGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfZm1vZC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9mbW9kZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19pZWVlNzU0X2Ztb2RmKHgseSkKKyAqIFJldHVybiB4IG1vZCB5IGluIGV4YWN0IGFyaXRobWV0aWMKKyAqIE1ldGhvZDogc2hpZnQgYW5kIHN1YnRyYWN0CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMCwgWmVyb1tdID0gezAuMCwgLTAuMCx9OworCitmbG9hdAorX19pZWVlNzU0X2Ztb2RmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGh5PT0wfHwoaHg+PTB4N2Y4MDAwMDApfHwJCS8qIHk9MCxvciB4IG5vdCBmaW5pdGUgKi8KKwkgICAoaHk+MHg3ZjgwMDAwMCkpCQkJLyogb3IgeSBpcyBOYU4gKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PGh5KSByZXR1cm4geDsJCQkvKiB8eHw8fHl8IHJldHVybiB4ICovCisJaWYoaHg9PWh5KQorCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CS8qIHx4fD18eXwgcmV0dXJuIHgqMCovCisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yIChpeCA9IC0xMjYsaT0oaHg8PDgpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJfSBlbHNlIGl4ID0gKGh4Pj4yMyktMTI3OworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGZvciAoaXkgPSAtMTI2LGk9KGh5PDw4KTsgaT49MDsgaTw8PTEpIGl5IC09MTsKKwl9IGVsc2UgaXkgPSAoaHk+PjIzKS0xMjc7CisKKyAgICAvKiBzZXQgdXAge2h4LGx4fSwge2h5LGx5fSBhbmQgYWxpZ24geSB0byB4ICovCisJaWYoaXggPj0gLTEyNikKKwkgICAgaHggPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh4KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB4LCBzaGlmdCB4IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peDsKKwkgICAgaHggPSBoeDw8bjsKKwl9CisJaWYoaXkgPj0gLTEyNikKKwkgICAgaHkgPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peTsKKwkgICAgaHkgPSBoeTw8bjsKKwl9CisKKyAgICAvKiBmaXggcG9pbnQgZm1vZCAqLworCW4gPSBpeCAtIGl5OworCXdoaWxlKG4tLSkgeworCSAgICBoej1oeC1oeTsKKwkgICAgaWYoaHo8MCl7aHggPSBoeCtoeDt9CisJICAgIGVsc2UgeworCSAgICAJaWYoaHo9PTApIAkJLyogcmV0dXJuIHNpZ24oeCkqMCAqLworCQkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCSAgICAJaHggPSBoeitoejsKKwkgICAgfQorCX0KKwloej1oeC1oeTsKKwlpZihoej49MCkge2h4PWh6O30KKworICAgIC8qIGNvbnZlcnQgYmFjayB0byBmbG9hdGluZyB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgc2lnbiAqLworCWlmKGh4PT0wKSAJCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsKKwl3aGlsZShoeDwweDAwODAwMDAwKSB7CQkvKiBub3JtYWxpemUgeCAqLworCSAgICBoeCA9IGh4K2h4OworCSAgICBpeSAtPSAxOworCX0KKwlpZihpeT49IC0xMjYpIHsJCS8qIG5vcm1hbGl6ZSBvdXRwdXQgKi8KKwkgICAgaHggPSAoKGh4LTB4MDA4MDAwMDApfCgoaXkrMTI3KTw8MjMpKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCxoeHxzeCk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMjYgLSBpeTsKKwkgICAgaHggPj49IG47CisJICAgIFNFVF9GTE9BVF9XT1JEKHgsaHh8c3gpOworCSAgICB4ICo9IG9uZTsJCS8qIGNyZWF0ZSBuZWNlc3Nhcnkgc2lnbmFsICovCisJfQorCXJldHVybiB4OwkJLyogZXhhY3Qgb3V0cHV0ICovCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hLmMgYi9saWJtL3NyYy9lX2dhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZmYxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZ2FtbWEuYwpAQCAtMCwwICsxLDM0IEBACisKKy8qIEAoIyllX2dhbW1hLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hLmMsdiAxLjcgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9nYW1tYSh4KQorICogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9mIHguCisgKgorICogTWV0aG9kOiBjYWxsIF9faWVlZTc1NF9nYW1tYV9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitkb3VibGUKK19faWVlZTc1NF9nYW1tYShkb3VibGUgeCkKK3sKKwlyZXR1cm4gX19pZWVlNzU0X2dhbW1hX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hX3IuYyBiL2xpYm0vc3JjL2VfZ2FtbWFfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODMzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hX3IuYwpAQCAtMCwwICsxLDMzIEBACisKKy8qIEAoIyllX2dhbW1hX3IuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZ2FtbWFfci5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfZ2FtbWFfcih4LCBzaWduZ2FtcCkKKyAqIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIAorICogd2l0aCB1c2VyIHByb3ZpZGUgcG9pbnRlciBmb3IgdGhlIHNpZ24gb2YgR2FtbWEoeCkuIAorICoKKyAqIE1ldGhvZDogU2VlIF9faWVlZTc1NF9sZ2FtbWFfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorX19pZWVlNzU0X2dhbW1hX3IoZG91YmxlIHgsIGludCAqc2lnbmdhbXApCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFfcih4LHNpZ25nYW1wKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfZ2FtbWFmLmMgYi9saWJtL3NyYy9lX2dhbW1hZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzJlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2dhbW1hZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGVfZ2FtbWFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2dhbW1hLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2dhbW1hZi5jLHYgMS42IDIwMDIvMDUvMjggMTc6MDM6MTIgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfZ2FtbWFmKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2dhbW1hZl9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitmbG9hdAorX19pZWVlNzU0X2dhbW1hZihmbG9hdCB4KQoreworCXJldHVybiBfX2llZWU3NTRfZ2FtbWFmX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2dhbW1hZl9yLmMgYi9saWJtL3NyYy9lX2dhbW1hZl9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMDBjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfZ2FtbWFmX3IuYwpAQCAtMCwwICsxLDM0IEBACisvKiBlX2dhbW1hZl9yLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2dhbW1hX3IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfZ2FtbWFmX3IuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjAzIGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2dhbW1hZl9yKHgsIHNpZ25nYW1wKQorICogUmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24KKyAqIHdpdGggdXNlciBwcm92aWRlIHBvaW50ZXIgZm9yIHRoZSBzaWduIG9mIEdhbW1hKHgpLgorICoKKyAqIE1ldGhvZDogU2VlIF9faWVlZTc1NF9sZ2FtbWFmX3IKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitmbG9hdAorX19pZWVlNzU0X2dhbW1hZl9yKGZsb2F0IHgsIGludCAqc2lnbmdhbXApCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFmX3IoeCxzaWduZ2FtcCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2h5cG90LmMgYi9saWJtL3NyYy9lX2h5cG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzODVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfaHlwb3QuYwpAQCAtMCwwICsxLDEyNSBAQAorCisvKiBAKCMpZV9oeXBvdC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2h5cG90LmMsdiAxLjkgMjAwNS8wMi8wNCAxODoyNjowNSBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9oeXBvdCh4LHkpCisgKgorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqCUlmIChhc3N1bWUgcm91bmQtdG8tbmVhcmVzdCkgej14KngreSp5IAorICoJaGFzIGVycm9yIGxlc3MgdGhhbiBzcXJ0KDIpLzIgdWxwLCB0aGFuIAorICoJc3FydCh6KSBoYXMgZXJyb3IgbGVzcyB0aGFuIDEgdWxwIChleGVyY2lzZSkuCisgKgorICoJU28sIGNvbXB1dGUgc3FydCh4KngreSp5KSB3aXRoIHNvbWUgY2FyZSBhcyAKKyAqCWZvbGxvd3MgdG8gZ2V0IHRoZSBlcnJvciBiZWxvdyAxIHVscDoKKyAqCisgKglBc3N1bWUgeD55PjA7CisgKgkoaWYgcG9zc2libGUsIHNldCByb3VuZGluZyB0byByb3VuZC10by1uZWFyZXN0KQorICoJMS4gaWYgeCA+IDJ5ICB1c2UKKyAqCQl4MSp4MSsoeSp5Kyh4MiooeCt4MSkpKSBmb3IgeCp4K3kqeQorICoJd2hlcmUgeDEgPSB4IHdpdGggbG93ZXIgMzIgYml0cyBjbGVhcmVkLCB4MiA9IHgteDE7IGVsc2UKKyAqCTIuIGlmIHggPD0gMnkgdXNlCisgKgkJdDEqeTErKCh4LXkpKih4LXkpKyh0MSp5Mit0Mip5KSkKKyAqCXdoZXJlIHQxID0gMnggd2l0aCBsb3dlciAzMiBiaXRzIGNsZWFyZWQsIHQyID0gMngtdDEsIAorICoJeTE9IHkgd2l0aCBsb3dlciAzMiBiaXRzIGNob3BwZWQsIHkyID0geS15MS4KKyAqCQkKKyAqCU5PVEU6IHNjYWxpbmcgbWF5IGJlIG5lY2Vzc2FyeSBpZiBzb21lIGFyZ3VtZW50IGlzIHRvbyAKKyAqCSAgICAgIGxhcmdlIG9yIHRvbyB0aW55CisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWh5cG90KHgseSkgaXMgSU5GIGlmIHggb3IgeSBpcyArSU5GIG9yIC1JTkY7IGVsc2UKKyAqCWh5cG90KHgseSkgaXMgTkFOIGlmIHggb3IgeSBpcyBOQU4uCisgKgorICogQWNjdXJhY3k6CisgKiAJaHlwb3QoeCx5KSByZXR1cm5zIHNxcnQoeF4yK3leMikgd2l0aCBlcnJvciBsZXNzIAorICogCXRoYW4gMSB1bHBzICh1bml0cyBpbiB0aGUgbGFzdCBwbGFjZSkgCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCitfX2llZWU3NTRfaHlwb3QoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBhPXgsYj15LHQxLHQyLHkxLHkyLHc7CisJaW50MzJfdCBqLGssaGEsaGI7CisKKwlHRVRfSElHSF9XT1JEKGhhLHgpOworCWhhICY9IDB4N2ZmZmZmZmY7CisJR0VUX0hJR0hfV09SRChoYix5KTsKKwloYiAmPSAweDdmZmZmZmZmOworCWlmKGhiID4gaGEpIHthPXk7Yj14O2o9aGE7IGhhPWhiO2hiPWo7fSBlbHNlIHthPXg7Yj15O30KKwlTRVRfSElHSF9XT1JEKGEsaGEpOwkvKiBhIDwtIHxhfCAqLworCVNFVF9ISUdIX1dPUkQoYixoYik7CS8qIGIgPC0gfGJ8ICovCisJaWYoKGhhLWhiKT4weDNjMDAwMDApIHtyZXR1cm4gYStiO30gLyogeC95ID4gMioqNjAgKi8KKwlrPTA7CisJaWYoaGEgPiAweDVmMzAwMDAwKSB7CS8qIGE+MioqNTAwICovCisJICAgaWYoaGEgPj0gMHg3ZmYwMDAwMCkgewkvKiBJbmYgb3IgTmFOICovCisJICAgICAgIHVfaW50MzJfdCBsb3c7CisJICAgICAgIHcgPSBhK2I7CQkJLyogZm9yIHNOYU4gKi8KKwkgICAgICAgR0VUX0xPV19XT1JEKGxvdyxhKTsKKwkgICAgICAgaWYoKChoYSYweGZmZmZmKXxsb3cpPT0wKSB3ID0gYTsKKwkgICAgICAgR0VUX0xPV19XT1JEKGxvdyxiKTsKKwkgICAgICAgaWYoKChoYl4weDdmZjAwMDAwKXxsb3cpPT0wKSB3ID0gYjsKKwkgICAgICAgcmV0dXJuIHc7CisJICAgfQorCSAgIC8qIHNjYWxlIGEgYW5kIGIgYnkgMioqLTYwMCAqLworCSAgIGhhIC09IDB4MjU4MDAwMDA7IGhiIC09IDB4MjU4MDAwMDA7CWsgKz0gNjAwOworCSAgIFNFVF9ISUdIX1dPUkQoYSxoYSk7CisJICAgU0VUX0hJR0hfV09SRChiLGhiKTsKKwl9CisJaWYoaGIgPCAweDIwYjAwMDAwKSB7CS8qIGIgPCAyKiotNTAwICovCisJICAgIGlmKGhiIDw9IDB4MDAwZmZmZmYpIHsJLyogc3Vibm9ybWFsIGIgb3IgMCAqLworCSAgICAgICAgdV9pbnQzMl90IGxvdzsKKwkJR0VUX0xPV19XT1JEKGxvdyxiKTsKKwkJaWYoKGhifGxvdyk9PTApIHJldHVybiBhOworCQl0MT0wOworCQlTRVRfSElHSF9XT1JEKHQxLDB4N2ZkMDAwMDApOwkvKiB0MT0yXjEwMjIgKi8KKwkJYiAqPSB0MTsKKwkJYSAqPSB0MTsKKwkJayAtPSAxMDIyOworCSAgICB9IGVsc2UgewkJLyogc2NhbGUgYSBhbmQgYiBieSAyXjYwMCAqLworCSAgICAgICAgaGEgKz0gMHgyNTgwMDAwMDsgCS8qIGEgKj0gMl42MDAgKi8KKwkJaGIgKz0gMHgyNTgwMDAwMDsJLyogYiAqPSAyXjYwMCAqLworCQlrIC09IDYwMDsKKwkJU0VUX0hJR0hfV09SRChhLGhhKTsKKwkJU0VUX0hJR0hfV09SRChiLGhiKTsKKwkgICAgfQorCX0KKyAgICAvKiBtZWRpdW0gc2l6ZSBhIGFuZCBiICovCisJdyA9IGEtYjsKKwlpZiAodz5iKSB7CisJICAgIHQxID0gMDsKKwkgICAgU0VUX0hJR0hfV09SRCh0MSxoYSk7CisJICAgIHQyID0gYS10MTsKKwkgICAgdyAgPSBzcXJ0KHQxKnQxLShiKigtYiktdDIqKGErdDEpKSk7CisJfSBlbHNlIHsKKwkgICAgYSAgPSBhK2E7CisJICAgIHkxID0gMDsKKwkgICAgU0VUX0hJR0hfV09SRCh5MSxoYik7CisJICAgIHkyID0gYiAtIHkxOworCSAgICB0MSA9IDA7CisJICAgIFNFVF9ISUdIX1dPUkQodDEsaGErMHgwMDEwMDAwMCk7CisJICAgIHQyID0gYSAtIHQxOworCSAgICB3ICA9IHNxcnQodDEqeTEtKHcqKC13KS0odDEqeTIrdDIqYikpKTsKKwl9CisJaWYoayE9MCkgeworCSAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgdDEgPSAxLjA7CisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx0MSk7CisJICAgIFNFVF9ISUdIX1dPUkQodDEsaGlnaCsoazw8MjApKTsKKwkgICAgcmV0dXJuIHQxKnc7CisJfSBlbHNlIHJldHVybiB3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9oeXBvdGYuYyBiL2xpYm0vc3JjL2VfaHlwb3RmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MDc1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfaHlwb3RmLmMKQEAgLTAsMCArMSw4MyBAQAorLyogZV9oeXBvdGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfaHlwb3QuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfaHlwb3RmLmMsdiAxLjkgMjAwMi8wNS8yOCAxODoxNTowMyBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitfX2llZWU3NTRfaHlwb3RmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisJZmxvYXQgYT14LGI9eSx0MSx0Mix5MSx5Mix3OworCWludDMyX3QgaixrLGhhLGhiOworCisJR0VUX0ZMT0FUX1dPUkQoaGEseCk7CisJaGEgJj0gMHg3ZmZmZmZmZjsKKwlHRVRfRkxPQVRfV09SRChoYix5KTsKKwloYiAmPSAweDdmZmZmZmZmOworCWlmKGhiID4gaGEpIHthPXk7Yj14O2o9aGE7IGhhPWhiO2hiPWo7fSBlbHNlIHthPXg7Yj15O30KKwlTRVRfRkxPQVRfV09SRChhLGhhKTsJLyogYSA8LSB8YXwgKi8KKwlTRVRfRkxPQVRfV09SRChiLGhiKTsJLyogYiA8LSB8YnwgKi8KKwlpZigoaGEtaGIpPjB4ZjAwMDAwMCkge3JldHVybiBhK2I7fSAvKiB4L3kgPiAyKiozMCAqLworCWs9MDsKKwlpZihoYSA+IDB4NTg4MDAwMDApIHsJLyogYT4yKio1MCAqLworCSAgIGlmKGhhID49IDB4N2Y4MDAwMDApIHsJLyogSW5mIG9yIE5hTiAqLworCSAgICAgICB3ID0gYStiOwkJCS8qIGZvciBzTmFOICovCisJICAgICAgIGlmKGhhID09IDB4N2Y4MDAwMDApIHcgPSBhOworCSAgICAgICBpZihoYiA9PSAweDdmODAwMDAwKSB3ID0gYjsKKwkgICAgICAgcmV0dXJuIHc7CisJICAgfQorCSAgIC8qIHNjYWxlIGEgYW5kIGIgYnkgMioqLTY4ICovCisJICAgaGEgLT0gMHgyMjAwMDAwMDsgaGIgLT0gMHgyMjAwMDAwMDsJayArPSA2ODsKKwkgICBTRVRfRkxPQVRfV09SRChhLGhhKTsKKwkgICBTRVRfRkxPQVRfV09SRChiLGhiKTsKKwl9CisJaWYoaGIgPCAweDI2ODAwMDAwKSB7CS8qIGIgPCAyKiotNTAgKi8KKwkgICAgaWYoaGIgPD0gMHgwMDdmZmZmZikgewkvKiBzdWJub3JtYWwgYiBvciAwICovCisJICAgICAgICBpZihoYj09MCkgcmV0dXJuIGE7CisJCVNFVF9GTE9BVF9XT1JEKHQxLDB4N2U4MDAwMDApOwkvKiB0MT0yXjEyNiAqLworCQliICo9IHQxOworCQlhICo9IHQxOworCQlrIC09IDEyNjsKKwkgICAgfSBlbHNlIHsJCS8qIHNjYWxlIGEgYW5kIGIgYnkgMl42OCAqLworCSAgICAgICAgaGEgKz0gMHgyMjAwMDAwMDsgCS8qIGEgKj0gMl42OCAqLworCQloYiArPSAweDIyMDAwMDAwOwkvKiBiICo9IDJeNjggKi8KKwkJayAtPSA2ODsKKwkJU0VUX0ZMT0FUX1dPUkQoYSxoYSk7CisJCVNFVF9GTE9BVF9XT1JEKGIsaGIpOworCSAgICB9CisJfQorICAgIC8qIG1lZGl1bSBzaXplIGEgYW5kIGIgKi8KKwl3ID0gYS1iOworCWlmICh3PmIpIHsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaGEmMHhmZmZmZjAwMCk7CisJICAgIHQyID0gYS10MTsKKwkgICAgdyAgPSBfX2llZWU3NTRfc3FydGYodDEqdDEtKGIqKC1iKS10MiooYSt0MSkpKTsKKwl9IGVsc2UgeworCSAgICBhICA9IGErYTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeTEsaGImMHhmZmZmZjAwMCk7CisJICAgIHkyID0gYiAtIHkxOworCSAgICBTRVRfRkxPQVRfV09SRCh0MSxoYSsweDAwODAwMDAwKTsKKwkgICAgdDIgPSBhIC0gdDE7CisJICAgIHcgID0gX19pZWVlNzU0X3NxcnRmKHQxKnkxLSh3KigtdyktKHQxKnkyK3QyKmIpKSk7CisJfQorCWlmKGshPTApIHsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsMHgzZjgwMDAwMCsoazw8MjMpKTsKKwkgICAgcmV0dXJuIHQxKnc7CisJfSBlbHNlIHJldHVybiB3OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9qMC5jIGIvbGlibS9zcmMvZV9qMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2owLmMKQEAgLTAsMCArMSwzODIgQEAKKworLyogQCgjKWVfajAuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9qMC5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDUgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfajAoeCksIF9faWVlZTc1NF95MCh4KQorICogQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGtpbmRzIG9mIG9yZGVyIHplcm8uCisgKiBNZXRob2QgLS0gajAoeCk6CisgKgkxLiBGb3IgdGlueSB4LCB3ZSB1c2UgajAoeCkgPSAxIC0geF4yLzQgKyB4XjQvNjQgLSAuLi4KKyAqCTIuIFJlZHVjZSB4IHRvIHx4fCBzaW5jZSBqMCh4KT1qMCgteCksICBhbmQKKyAqCSAgIGZvciB4IGluICgwLDIpCisgKgkJajAoeCkgPSAxLXovNCsgel4yKlIwL1MwLCAgd2hlcmUgeiA9IHgqeDsKKyAqCSAgIChwcmVjaXNpb246ICB8ajAtMSt6LzQtel4yUjAvUzAgfDwyKiotNjMuNjcgKQorICoJICAgZm9yIHggaW4gKDIsaW5mKQorICogCQlqMCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpjb3MoeDApLXEwKHgpKnNpbih4MCkpCisgKiAJICAgd2hlcmUgeDAgPSB4LXBpLzQuIEl0IGlzIGJldHRlciB0byBjb21wdXRlIHNpbih4MCksY29zKHgwKQorICoJICAgYXMgZm9sbG93OgorICoJCWNvcyh4MCkgPSBjb3MoeCljb3MocGkvNCkrc2luKHgpc2luKHBpLzQpCisgKgkJCT0gMS9zcXJ0KDIpICogKGNvcyh4KSArIHNpbih4KSkKKyAqCQlzaW4oeDApID0gc2luKHgpY29zKHBpLzQpLWNvcyh4KXNpbihwaS80KQorICoJCQk9IDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgKiAJICAgKFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgKgkJc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICogCSAgICB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuKQorICoJICAgCisgKgkzIFNwZWNpYWwgY2FzZXMKKyAqCQlqMChuYW4pPSBuYW4KKyAqCQlqMCgwKSA9IDEKKyAqCQlqMChpbmYpID0gMAorICoJCQorICogTWV0aG9kIC0tIHkwKHgpOgorICoJMS4gRm9yIHg8Mi4KKyAqCSAgIFNpbmNlIAorICoJCXkwKHgpID0gMi9waSooajAoeCkqKGxuKHgvMikrRXVsZXIpICsgeF4yLzQgLSAuLi4pCisgKgkgICB0aGVyZWZvcmUgeTAoeCktMi9waSpqMCh4KSpsbih4KSBpcyBhbiBldmVuIGZ1bmN0aW9uLgorICoJICAgV2UgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gYXBwcm94aW1hdGUgeTAsCisgKgkJeTAoeCkgPSBVKHopL1YoeikgKyAoMi9waSkqKGowKHgpKmxuKHgpKSwgej0geF4yCisgKgkgICB3aGVyZSAKKyAqCQlVKHopID0gdTAwICsgdTAxKnogKyAuLi4gKyB1MDYqel42CisgKgkJVih6KSA9IDEgICsgdjAxKnogKyAuLi4gKyB2MDQqel40CisgKgkgICB3aXRoIGFic29sdXRlIGFwcHJveGltYXRpb24gZXJyb3IgYm91bmRlZCBieSAyKiotNzIuCisgKgkgICBOb3RlOiBGb3IgdGlueSB4LCBVL1YgPSB1MCBhbmQgajAoeCl+MSwgaGVuY2UKKyAqCQl5MCh0aW55KSA9IHUwICsgKDIvcGkpKmxuKHRpbnkpLCAoY2hvb3NlIHRpbnk8MioqLTI3KQorICoJMi4gRm9yIHg+PTIuCisgKiAJCXkwKHgpID0gc3FydCgyLyhwaSp4KSkqKHAwKHgpKmNvcyh4MCkrcTAoeCkqc2luKHgwKSkKKyAqIAkgICB3aGVyZSB4MCA9IHgtcGkvNC4gSXQgaXMgYmV0dGVyIHRvIGNvbXB1dGUgc2luKHgwKSxjb3MoeDApCisgKgkgICBieSB0aGUgbWV0aG9kIG1lbnRpb25lZCBhYm92ZS4KKyAqCTMuIFNwZWNpYWwgY2FzZXM6IHkwKDApPS1pbmYsIHkwKHg8MCk9TmFOLCB5MChpbmYpPTAuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGRvdWJsZSBwemVybyhkb3VibGUpLCBxemVybyhkb3VibGUpOworCitzdGF0aWMgY29uc3QgZG91YmxlCitodWdlIAk9IDFlMzAwLAorb25lCT0gMS4wLAoraW52c3FydHBpPSAgNS42NDE4OTU4MzU0Nzc1NjI3OTI4MGUtMDEsIC8qIDB4M0ZFMjBERDcsIDB4NTA0MjlCNkQgKi8KK3RwaSAgICAgID0gIDYuMzY2MTk3NzIzNjc1ODEzODI0MzNlLTAxLCAvKiAweDNGRTQ1RjMwLCAweDZEQzlDODgzICovCisgCQkvKiBSMC9TMCBvbiBbMCwgMi4wMF0gKi8KK1IwMiAgPSAgMS41NjI0OTk5OTk5OTk5OTk0Nzk1OGUtMDIsIC8qIDB4M0Y4RkZGRkYsIDB4RkZGRkZGRkQgKi8KK1IwMyAgPSAtMS44OTk3OTI5NDIzODg1NDcyMTc1MWUtMDQsIC8qIDB4QkYyOEU2QTUsIDB4QjYxQUM2RTkgKi8KK1IwNCAgPSAgMS44Mjk1NDA0OTUzMjcwMDY2NTY3MGUtMDYsIC8qIDB4M0VCRUIxRDEsIDB4MEM1MDM5MTkgKi8KK1IwNSAgPSAtNC42MTgzMjY4ODUzMjEwMzE4OTE5OWUtMDksIC8qIDB4QkUzM0Q1RTcsIDB4NzNENjNGQ0UgKi8KK1MwMSAgPSAgMS41NjE5MTAyOTQ2NDg5MDAxMDQ5MmUtMDIsIC8qIDB4M0Y4RkZDRTgsIDB4ODJDOEMyQTQgKi8KK1MwMiAgPSAgMS4xNjkyNjc4NDY2MzMzNzQ1MDI2MGUtMDQsIC8qIDB4M0YxRUE2RDIsIDB4REQ1N0RCRjQgKi8KK1MwMyAgPSAgNS4xMzU0NjU1MDIwNzMxODExMTQ0NmUtMDcsIC8qIDB4M0VBMTNCNTQsIDB4Q0U4NEQ1QTkgKi8KK1MwNCAgPSAgMS4xNjYxNDAwMzMzMzc5MDAwMDIwNWUtMDk7IC8qIDB4M0UxNDA4QkMsIDB4RjQ3NDVEOEYgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSB6ZXJvID0gMC4wOworCitkb3VibGUKK19faWVlZTc1NF9qMChkb3VibGUgeCkKK3sKKwlkb3VibGUgeiwgcyxjLHNzLGNjLHIsdSx2OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIG9uZS8oeCp4KTsKKwl4ID0gZmFicyh4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbih4KTsKKwkJYyA9IGNvcyh4KTsKKwkJc3MgPSBzLWM7CisJCWNjID0gcytjOworCQlpZihpeDwweDdmZTAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworCQkgICAgeiA9IC1jb3MoeCt4KTsKKwkJICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnQoeCk7CisJCWVsc2UgeworCQkgICAgdSA9IHB6ZXJvKHgpOyB2ID0gcXplcm8oeCk7CisJCSAgICB6ID0gaW52c3FydHBpKih1KmNjLXYqc3MpL3NxcnQoeCk7CisJCX0KKwkJcmV0dXJuIHo7CisJfQorCWlmKGl4PDB4M2YyMDAwMDApIHsJLyogfHh8IDwgMioqLTEzICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHsJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgICAgIGlmKGl4PDB4M2U0MDAwMDApIHJldHVybiBvbmU7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgICAgIGVsc2UgCSAgICAgIHJldHVybiBvbmUgLSAwLjI1KngqeDsKKwkgICAgfQorCX0KKwl6ID0geCp4OworCXIgPSAgeiooUjAyK3oqKFIwMyt6KihSMDQreipSMDUpKSk7CisJcyA9ICBvbmUreiooUzAxK3oqKFMwMit6KihTMDMreipTMDQpKSk7CisJaWYoaXggPCAweDNGRjAwMDAwKSB7CS8qIHx4fCA8IDEuMDAgKi8KKwkgICAgcmV0dXJuIG9uZSArIHoqKC0wLjI1KyhyL3MpKTsKKwl9IGVsc2UgeworCSAgICB1ID0gMC41Kng7CisJICAgIHJldHVybigob25lK3UpKihvbmUtdSkreiooci9zKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgZG91YmxlCit1MDAgID0gLTcuMzgwNDI5NTEwODY4NzIzMTc1MjNlLTAyLCAvKiAweEJGQjJFNEQ2LCAweDk5Q0JEMDFGICovCit1MDEgID0gIDEuNzY2NjY0NTI1MDkxODExMTU1MzhlLTAxLCAvKiAweDNGQzY5RDAxLCAweDlERTlFM0ZDICovCit1MDIgID0gLTEuMzgxODU2NzE5NDU1OTY4OTg4OTZlLTAyLCAvKiAweEJGOEM0Q0U4LCAweEIxNkNGQTk3ICovCit1MDMgID0gIDMuNDc0NTM0MzIwOTM2ODM2NTAyMzhlLTA0LCAvKiAweDNGMzZDNTRELCAweDIwQjI5QjZCICovCit1MDQgID0gLTMuODE0MDcwNTM3MjQzNjQxNjExMjVlLTA2LCAvKiAweEJFQ0ZGRUE3LCAweDczRDI1Q0FEICovCit1MDUgID0gIDEuOTU1OTAxMzcwMzUwMjI5MjAyMDZlLTA4LCAvKiAweDNFNTUwMDU3LCAweDNCNEVBQkQ0ICovCit1MDYgID0gLTMuOTgyMDUxOTQxMzIxMDMzOTg0NTNlLTExLCAvKiAweEJEQzVFNDNELCAweDY5M0ZCM0M4ICovCit2MDEgID0gIDEuMjczMDQ4MzQ4MzQxMjM2OTkzMjhlLTAyLCAvKiAweDNGOEExMjcwLCAweDkxQzlDNzFBICovCit2MDIgID0gIDcuNjAwNjg2MjczNTAzNTMyNTM3MDJlLTA1LCAvKiAweDNGMTNFQ0JCLCAweEY1NzhDNkMxICovCit2MDMgID0gIDIuNTkxNTA4NTE4NDA0NTc4MDU0NjdlLTA3LCAvKiAweDNFOTE2NDJELCAweDdGRjIwMkZEICovCit2MDQgID0gIDQuNDExMTAzMTEzMzI2NzU0Njc0MDNlLTEwOyAvKiAweDNERkU1MDE4LCAweDNCRDZEOUVGICovCisKK2RvdWJsZQorX19pZWVlNzU0X3kwKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2MsdSx2OworCWludDMyX3QgaHgsaXgsbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogWTAoTmFOKSBpcyBOYU4sIHkwKC1pbmYpIGlzIE5hbiwgeTAoaW5mKSBpcyAwICAqLworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4gIG9uZS8oeCt4KngpOyAKKyAgICAgICAgaWYoKGl4fGx4KT09MCkgcmV0dXJuIC1vbmUvemVybzsKKyAgICAgICAgaWYoaHg8MCkgcmV0dXJuIHplcm8vemVybzsKKyAgICAgICAgaWYoaXggPj0gMHg0MDAwMDAwMCkgeyAgLyogfHh8ID49IDIuMCAqLworICAgICAgICAvKiB5MCh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMCh4KSpzaW4oeDApK3EwKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC1waS80CisgICAgICAgICAqICAgICAgQmV0dGVyIGZvcm11bGE6CisgICAgICAgICAqICAgICAgICAgICAgICBjb3MoeDApID0gY29zKHgpY29zKHBpLzQpK3Npbih4KXNpbihwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpICsgY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMgPSBzaW4oeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvcyh4KTsKKyAgICAgICAgICAgICAgICBzcyA9IHMtYzsKKyAgICAgICAgICAgICAgICBjYyA9IHMrYzsKKwkvKgorCSAqIGowKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqY2MgLSBRKDAseCkqc3MpIC8gc3FydCh4KQorCSAqIHkwKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqc3MgKyBRKDAseCkqY2MpIC8gc3FydCh4KQorCSAqLworICAgICAgICAgICAgICAgIGlmKGl4PDB4N2ZlMDAwMDApIHsgIC8qIG1ha2Ugc3VyZSB4K3ggbm90IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIHogPSAtY29zKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKTx6ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcHplcm8oeCk7IHYgPSBxemVybyh4KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IGludnNxcnRwaSoodSpzcyt2KmNjKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKwl9CisJaWYoaXg8PTB4M2U0MDAwMDApIHsJLyogeCA8IDIqKi0yNyAqLworCSAgICByZXR1cm4odTAwICsgdHBpKl9faWVlZTc1NF9sb2coeCkpOworCX0KKwl6ID0geCp4OworCXUgPSB1MDAreioodTAxK3oqKHUwMit6Kih1MDMreioodTA0K3oqKHUwNSt6KnUwNikpKSkpOworCXYgPSBvbmUreioodjAxK3oqKHYwMit6Kih2MDMreip2MDQpKSk7CisJcmV0dXJuKHUvdiArIHRwaSooX19pZWVlNzU0X2owKHgpKl9faWVlZTc1NF9sb2coeCkpKTsKK30KKworLyogVGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBwemVybyBpcworICoJMSAtIDkvMTI4IHNeMiArIDExMDI1Lzk4MzA0IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIEZvciB4ID49IDIsIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcHplcm8oeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcFIwICsgcFIxKnNeMiArIHBSMipzXjQgKyAuLi4gKyBwUjUqc14xMAorICogCSAgUyA9IDEgKyBwUzAqc14yICsgLi4uICsgcFM0KnNeMTAKKyAqIGFuZAorICoJfCBwemVybyh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjI2KQorICovCitzdGF0aWMgY29uc3QgZG91YmxlIHBSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgKi8KKyAtNy4wMzEyNDk5OTk5OTkwMDM1NzQ4NGUtMDIsIC8qIDB4QkZCMUZGRkYsIDB4RkZGRkZEMzIgKi8KKyAtOC4wODE2NzA0MTI3NTM0OTc5NTYyNmUrMDAsIC8qIDB4QzAyMDI5RDAsIDB4QjQ0RkE3NzkgKi8KKyAtMi41NzA2MzEwNTY3OTcwNDg0NzI2MmUrMDIsIC8qIDB4QzA3MDExMDIsIDB4N0IxOUU4NjMgKi8KKyAtMi40ODUyMTY0MTAwOTQyODgyMjE0NGUrMDMsIC8qIDB4QzBBMzZBNkUsIDB4Q0Q0RENBRkMgKi8KKyAtNS4yNTMwNDM4MDQ5MDcyOTU0NTI3MmUrMDMsIC8qIDB4QzBCNDg1MEIsIDB4MzZDQzY0M0QgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTOFs1XSA9IHsKKyAgMS4xNjUzNDM2NDYxOTY2ODE4MTcxN2UrMDIsIC8qIDB4NDA1RDIyMzMsIDB4MDdBOTY3NTEgKi8KKyAgMy44MzM3NDQ3NTM2NDEyMTgyNjcxNWUrMDMsIC8qIDB4NDBBREYzN0QsIDB4NTA1OTY5MzggKi8KKyAgNC4wNTk3ODU3MjY0ODQ3MjU0NTU1MmUrMDQsIC8qIDB4NDBFM0QyQkIsIDB4NkVCNkIwNUYgKi8KKyAgMS4xNjc1Mjk3MjU2NDM3NTkxNTY4MWUrMDUsIC8qIDB4NDBGQzgxMEYsIDB4OEY5RkE5QkQgKi8KKyAgNC43NjI3NzI4NDE0NjczMDk2MjY3NWUrMDQsIC8qIDB4NDBFNzQxNzcsIDB4NEYyQzQ5REMgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcFI1WzZdID0geyAvKiBmb3IgeCBpbiBbOCw0LjU0NTRdPTEvWzAuMTI1LDAuMjIwMDFdICovCisgLTEuMTQxMjU0NjQ2OTE4OTQ1MDI1ODRlLTExLCAvKiAweEJEQTkxOEIxLCAweDQ3RTQ5NUNDICovCisgLTcuMDMxMjQ5NDA4NzM1OTkyODAwNzhlLTAyLCAvKiAweEJGQjFGRkZGLCAweEU2OUFGQkM2ICovCisgLTQuMTU5NjEwNjQ0NzA1ODc3ODI0MzhlKzAwLCAvKiAweEMwMTBBMzcwLCAweEY5MEM2QkJGICovCisgLTYuNzY3NDc2NTIyNjUxNjcyNjEwMjFlKzAxLCAvKiAweEMwNTBFQjJGLCAweDVBN0QxNzgzICovCisgLTMuMzEyMzEyOTk2NDkxNzI5Njc3NDdlKzAyLCAvKiAweEMwNzRCM0IzLCAweDY3NDJDQzYzICovCisgLTMuNDY0MzMzODgzNjU2MDQ5MTI0NTFlKzAyLCAvKiAweEMwNzVBNkVGLCAweDI4QTM4QkQ3ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwUzVbNV0gPSB7CisgIDYuMDc1MzkzODI2OTIzMDAzMzU5NzVlKzAxLCAvKiAweDQwNEU2MDgxLCAweDBDOThDNURFICovCisgIDEuMDUxMjUyMzA1OTU3MDQ1NzkxNzNlKzAzLCAvKiAweDQwOTA2RDAyLCAweDVDN0UyODY0ICovCisgIDUuOTc4OTcwOTQzMzM4NTU3ODQ0OThlKzAzLCAvKiAweDQwQjc1QUY4LCAweDhGQkUxRDYwICovCisgIDkuNjI1NDQ1MTQzNTc3NzQ0NjAyMjNlKzAzLCAvKiAweDQwQzJDQ0I4LCAweEZBNzZGQTM4ICovCisgIDIuNDA2MDU4MTU5MjI5MzkxMDk0NDFlKzAzLCAvKiAweDQwQTJDQzFELCAweEM3MEJFODY0ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHBSM1s2XSA9IHsvKiBmb3IgeCBpbiBbNC41NDcsMi44NTcxXT0xL1swLjIxOTksMC4zNTAwMV0gKi8KKyAtMi41NDcwNDYwMTc3MTk1MTkxNTYyMGUtMDksIC8qIDB4QkUyNUUxMDMsIDB4NkZFMUFBODYgKi8KKyAtNy4wMzExOTYxNjM4MTQ4MTY1NDY1NGUtMDIsIC8qIDB4QkZCMUZGRjYsIDB4RjdDMEUyNEIgKi8KKyAtMi40MDkwMzIyMTU0OTUyOTYxMTQyM2UrMDAsIC8qIDB4QzAwMzQ1QjIsIDB4QUVBNDgwNzQgKi8KKyAtMi4xOTY1OTc3NDczNDg4MzA4NjQ2N2UrMDEsIC8qIDB4QzAzNUY3NEEsIDB4NENCOTRFMTQgKi8KKyAtNS44MDc5MTcwNDcwMTczNzU3MjIzNmUrMDEsIC8qIDB4QzA0RDBBMjIsIDB4NDIwQTFBNDUgKi8KKyAtMy4xNDQ3OTQ3MDU5NDg4ODUwMzg1NGUrMDEsIC8qIDB4QzAzRjcyQUMsIDB4QTg5MkQ4MEYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTM1s1XSA9IHsKKyAgMy41ODU2MDMzODA1NTIwOTcyNjM0OWUrMDEsIC8qIDB4NDA0MUVEOTIsIDB4ODQwNzdERDMgKi8KKyAgMy42MTUxMzk4MzA1MDMwMzg2MzgyMGUrMDIsIC8qIDB4NDA3Njk4MzksIDB4NDY0QTdDMEUgKi8KKyAgMS4xOTM2MDc4Mzc5MjExMTUzMzMzMGUrMDMsIC8qIDB4NDA5MkE2NkUsIDB4NkQxMDYxRDYgKi8KKyAgMS4xMjc5OTY3OTg1NjkwNzQxNDQzMmUrMDMsIC8qIDB4NDA5MTlGRkMsIDB4QjhDMzlCN0UgKi8KKyAgMS43MzU4MDkzMDgxMzMzNTc1NDY5MmUrMDIsIC8qIDB4NDA2NUIyOTYsIDB4RkMzNzkwODEgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcFIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAtOC44NzUzNDMzMzAzMjUyNjQxMTI1NGUtMDgsIC8qIDB4QkU3N0QzMTYsIDB4RTkyNzAyNkQgKi8KKyAtNy4wMzAzMDk5NTQ4MzYyNDc0MzI0N2UtMDIsIC8qIDB4QkZCMUZGNjIsIDB4NDk1RTFFNDIgKi8KKyAtMS40NTA3Mzg0Njc4MDk1Mjk4NjM1N2UrMDAsIC8qIDB4QkZGNzM2MzksIDB4OEEyNEE4NDMgKi8KKyAtNy42MzU2OTYxMzgyMzUyNzc3MDc5MWUrMDAsIC8qIDB4QzAxRThBRjMsIDB4RURBRkE3RjMgKi8KKyAtMS4xMTkzMTY2ODg2MDM1Njc0Nzc4NmUrMDEsIC8qIDB4QzAyNjYyRTYsIDB4QzUyNDYzMDMgKi8KKyAtMy4yMzM2NDU3OTM1MTMzNTMzNTAzM2UrMDAsIC8qIDB4QzAwOURFODEsIDB4QUY4RkU3MEYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHBTMls1XSA9IHsKKyAgMi4yMjIwMjk5NzUzMjA4ODgwODQ0MWUrMDEsIC8qIDB4NDAzNjM4NjUsIDB4OTA4QjU5NTkgKi8KKyAgMS4zNjIwNjc5NDIxODIxNTIwODA0OGUrMDIsIC8qIDB4NDA2MTA2OUUsIDB4MEVFODg3OEYgKi8KKyAgMi43MDQ3MDI3ODY1ODA4MzQ4Njc4OWUrMDIsIC8qIDB4NDA3MEU3ODYsIDB4NDJFQTA3OUIgKi8KKyAgMS41Mzg3NTM5NDIwODMyMDMyOTg4MWUrMDIsIC8qIDB4NDA2MzNDMDMsIDB4M0FCNkZBRkYgKi8KKyAgMS40NjU3NjE3Njk0ODI1NjE5MzgxMGUrMDEsIC8qIDB4NDAyRDUwQjMsIDB4NDQzOTE4MDkgKi8KK307CisKKwlzdGF0aWMgZG91YmxlIHB6ZXJvKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgeixyLHM7CisJaW50MzJfdCBpeDsKKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDAyMDAwMDApICAgICB7cCA9IHBSODsgcT0gcFM4O30KKwllbHNlIGlmKGl4Pj0weDQwMTIyRThCKXtwID0gcFI1OyBxPSBwUzU7fQorCWVsc2UgaWYoaXg+PTB4NDAwNkRCNkQpe3AgPSBwUjM7IHE9IHBTMzt9CisJZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHBSMjsgcT0gcFMyO30KKwl6ID0gb25lLyh4KngpOworCXIgPSBwWzBdK3oqKHBbMV0reioocFsyXSt6KihwWzNdK3oqKHBbNF0reipwWzVdKSkpKTsKKwlzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reipxWzRdKSkpKTsKKwlyZXR1cm4gb25lKyByL3M7Cit9CisJCQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHF6ZXJvIGlzCisgKgktMS84IHMgKyA3NS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcXplcm8oeCkgPSBzKigtMS4yNSArIChSL1MpKQorICogd2hlcmUgIFIgPSBxUjAgKyBxUjEqc14yICsgcVIyKnNeNCArIC4uLiArIHFSNSpzXjEwCisgKiAJICBTID0gMSArIHFTMCpzXjIgKyAuLi4gKyBxUzUqc14xMgorICogYW5kCisgKgl8IHF6ZXJvKHgpL3MgKzEuMjUtUi9TIHwgPD0gMiAgKiogKCAtNjEuMjIpCisgKi8KK3N0YXRpYyBjb25zdCBkb3VibGUgcVI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworICA3LjMyNDIxODc0OTk5OTM1MDUxOTUzZS0wMiwgLyogMHgzRkIyQkZGRiwgMHhGRkZGRkUyQyAqLworICAxLjE3NjgyMDY0NjgyMjUyNjkzODk5ZSswMSwgLyogMHg0MDI3ODk1MiwgMHg1QkIzMzRENiAqLworICA1LjU3NjczMzgwMjU2NDAxODU2MDU5ZSswMiwgLyogMHg0MDgxNkQ2MywgMHgxNTMwMTgyNSAqLworICA4Ljg1OTE5NzIwNzU2NDY4NjMyMzE3ZSswMywgLyogMHg0MEMxNEQ5OSwgMHgzRTE4RjQ2RCAqLworICAzLjcwMTQ2MjY3Nzc2ODg3ODM0NzcxZSswNCwgLyogMHg0MEUyMTJENCwgMHgwRTkwMTU2NiAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVM4WzZdID0geworICAxLjYzNzc2MDI2ODk1Njg5ODI0NDE0ZSswMiwgLyogMHg0MDY0NzhENSwgMHgzNjVCMzlCQyAqLworICA4LjA5ODM0NDk0NjU2NDQ5ODA1OTE2ZSswMywgLyogMHg0MEJGQTI1OCwgMHg0RTZCMDU2MyAqLworICAxLjQyNTM4MjkxNDE5MTIwNDc2MzQ4ZSswNSwgLyogMHg0MTAxNjY1MiwgMHg1NEQzOEMzRiAqLworICA4LjAzMzA5MjU3MTE5NTE0Mzk3MzQ1ZSswNSwgLyogMHg0MTI4ODNEQSwgMHg4M0E1MkI0MyAqLworICA4LjQwNTAxNTc5ODE5MDYwNTEyODE4ZSswNSwgLyogMHg0MTI5QTY2QiwgMHgyOERFMEIzRCAqLworIC0zLjQzODk5MjkzNTM3ODY2NjE1MjI1ZSswNSwgLyogMHhDMTE0RkQ2RCwgMHgyQzk1MzBDNSAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxUjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS44NDA4NTk2MzU5NDUxNTUzMTM4MWUtMTEsIC8qIDB4M0RCNDNEOEYsIDB4MjlDQzhDRDkgKi8KKyAgNy4zMjQyMTc2NjYxMjY4NDc2NTg5NmUtMDIsIC8qIDB4M0ZCMkJGRkYsIDB4RDE3MkIwNEMgKi8KKyAgNS44MzU2MzUwODk2MjA1Njk1Mzc3N2UrMDAsIC8qIDB4NDAxNzU3QjAsIDB4Qjk5NTNERDMgKi8KKyAgMS4zNTExMTU3NzI4NjQ0OTgyOTY3MWUrMDIsIC8qIDB4NDA2MEUzOTIsIDB4MEE4Nzg4RTkgKi8KKyAgMS4wMjcyNDM3NjU5NjE2NDA5NzQ2NGUrMDMsIC8qIDB4NDA5MDBDRjksIDB4OURDOEM0ODEgKi8KKyAgMS45ODk5Nzc4NTg2NDYwNTM4NDYzMWUrMDMsIC8qIDB4NDA5RjE3RTksIDB4NTNDNkUzQTYgKi8KK307CitzdGF0aWMgY29uc3QgZG91YmxlIHFTNVs2XSA9IHsKKyAgOC4yNzc2NjEwMjIzNjUzNzc2MTg4M2UrMDEsIC8qIDB4NDA1NEIxQjMsIDB4RkI1RTE1NDMgKi8KKyAgMi4wNzc4MTQxNjQyMTM5Mjk4NzEwNGUrMDMsIC8qIDB4NDBBMDNCQTAsIDB4REEyMUMwQ0UgKi8KKyAgMS44ODQ3Mjg4Nzc4NTcxODA4NTA3MGUrMDQsIC8qIDB4NDBEMjY3RDIsIDB4N0I1OTFFNkQgKi8KKyAgNS42NzUxMTEyMjg5NDk0NzMyOTc2OWUrMDQsIC8qIDB4NDBFQkI1RTMsIDB4OTdFMDIzNzIgKi8KKyAgMy41OTc2NzUzODQyNTExNDQ3MTQ2NWUrMDQsIC8qIDB4NDBFMTkxMTgsIDB4MUY3QTU0QTAgKi8KKyAtNS4zNTQzNDI3NTYwMTk0NDc3MzM3MWUrMDMsIC8qIDB4QzBCNEVBNTcsIDB4QkVEQkM2MDkgKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgcVIzWzZdID0gey8qIGZvciB4IGluIFs0LjU0NywyLjg1NzFdPTEvWzAuMjE5OSwwLjM1MDAxXSAqLworICA0LjM3NzQxMDE0MDg5NzM4NjIwOTA2ZS0wOSwgLyogMHgzRTMyQ0QwMywgMHg2QURFQ0I4MiAqLworICA3LjMyNDExMTgwMDQyOTExNDQ3MTYzZS0wMiwgLyogMHgzRkIyQkZFRSwgMHgwRThEMDg0MiAqLworICAzLjM0NDIzMTM3NTE2MTcwNzIwOTI5ZSswMCwgLyogMHg0MDBBQzBGQywgMHg2MTE0OUNGNSAqLworICA0LjI2MjE4NDQwNzQ1NDEyNjUwMDE3ZSswMSwgLyogMHg0MDQ1NEY5OCwgMHg5NjJEQUVERCAqLworICAxLjcwODA4MDkxMzQwNTY1NTk2MjgzZSswMiwgLyogMHg0MDY1NTlEQiwgMHhFMjVFRkQxRiAqLworICAxLjY2NzMzOTQ4Njk2NjUxMTY4NTc1ZSswMiwgLyogMHg0MDY0RDc3QywgMHg4MUZBMjFFMCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVMzWzZdID0geworICA0Ljg3NTg4NzI5NzI0NTg3MTgyMDkxZSswMSwgLyogMHg0MDQ4NjEyMiwgMHhCRkUzNDNBNiAqLworICA3LjA5Njg5MjIxMDU2NjA2MDE1NzM2ZSswMiwgLyogMHg0MDg2MkQ4MywgMHg4NjU0NEVCMyAqLworICAzLjcwNDE0ODIyNjIwMTExMzYyOTk0ZSswMywgLyogMHg0MEFDRjA0QiwgMHhFNDRERkM2MyAqLworICA2LjQ2MDQyNTE2NzUyNTY4OTE3NTgyZSswMywgLyogMHg0MEI5M0M2QywgMHhEN0M3NkEyOCAqLworICAyLjUxNjMzMzY4OTIwMzY4OTU3MzMzZSswMywgLyogMHg0MEEzQThBQSwgMHhEOTRGQjFDMCAqLworIC0xLjQ5MjQ3NDUxODM2MTU2Mzg2NjYyZSswMiwgLyogMHhDMDYyQTdFQiwgMHgyMDFDRjQwRiAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxUjJbNl0gPSB7LyogZm9yIHggaW4gWzIuODU3MCwyXT0xL1swLjM0OTksMC41XSAqLworICAxLjUwNDQ0NDQ0ODg2OTgzMjcyMzc5ZS0wNywgLyogMHgzRTg0MzEzQiwgMHg1NEY3NkJEQiAqLworICA3LjMyMjM0MjY1OTYzMDc5Mjc4MjcyZS0wMiwgLyogMHgzRkIyQkVDNSwgMHgzRTg4M0UzNCAqLworICAxLjk5ODE5MTc0MDkzODE1OTk4ODE2ZSswMCwgLyogMHgzRkZGRjg5NywgMHhFNzI3Nzc5QyAqLworICAxLjQ0OTU2MDI5MzQ3ODg1NzM1MzQ4ZSswMSwgLyogMHg0MDJDRkRCRiwgMHhBQUY5NkZFNSAqLworICAzLjE2NjYyMzE3NTA0NzgxNTQwODMzZSswMSwgLyogMHg0MDNGQUE4RSwgMHgyOUZCREM0QSAqLworICAxLjYyNTI3MDc1NzEwOTI5MjY3NDE2ZSswMSwgLyogMHg0MDMwNDBCMSwgMHg3MTgxNEJCNCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcVMyWzZdID0geworICAzLjAzNjU1ODQ4MzU1MjE5MTg0NDk4ZSswMSwgLyogMHg0MDNFNUQ5NiwgMHhGN0MwN0FFRCAqLworICAyLjY5MzQ4MTE4NjA4MDQ5ODQ0NjI0ZSswMiwgLyogMHg0MDcwRDU5MSwgMHhFNEQxNEI0MCAqLworICA4LjQ0NzgzNzU3NTk1MzIwMTM5NDQ0ZSswMiwgLyogMHg0MDhBNjY0NSwgMHgyMkIzQkYyMiAqLworICA4LjgyOTM1ODQ1MTEyNDg4NTUwNTEyZSswMiwgLyogMHg0MDhCOTc3QywgMHg5QzVDQzIxNCAqLworICAyLjEyNjY2Mzg4NTExNzk4ODI4NjMxZSswMiwgLyogMHg0MDZBOTU1MywgMHgwRTAwMTM2NSAqLworIC01LjMxMDk1NDkzODgyNjY2OTQ2OTE3ZSswMCwgLyogMHhDMDE1M0U2QSwgMHhGOEIzMjkzMSAqLworfTsKKworCXN0YXRpYyBkb3VibGUgcXplcm8oZG91YmxlIHgpCit7CisJY29uc3QgZG91YmxlICpwLCpxOworCWRvdWJsZSBzLHIsejsKKwlpbnQzMl90IGl4OworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcVI4OyBxPSBxUzg7fQorCWVsc2UgaWYoaXg+PTB4NDAxMjJFOEIpe3AgPSBxUjU7IHE9IHFTNTt9CisJZWxzZSBpZihpeD49MHg0MDA2REI2RCl7cCA9IHFSMzsgcT0gcVMzO30KKwllbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcVIyOyBxPSBxUzI7fQorCXogPSBvbmUvKHgqeCk7CisJciA9IHBbMF0reioocFsxXSt6KihwWzJdK3oqKHBbM10reioocFs0XSt6KnBbNV0pKSkpOworCXMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KihxWzRdK3oqcVs1XSkpKSkpOworCXJldHVybiAoLS4xMjUgKyByL3MpL3g7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2owZi5jIGIvbGlibS9zcmMvZV9qMGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODcyNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qMGYuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogZV9qMGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfajAuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfajBmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowMyBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBmbG9hdCBwemVyb2YoZmxvYXQpLCBxemVyb2YoZmxvYXQpOworCitzdGF0aWMgY29uc3QgZmxvYXQKK2h1Z2UgCT0gMWUzMCwKK29uZQk9IDEuMCwKK2ludnNxcnRwaT0gIDUuNjQxODk2MTI4N2UtMDEsIC8qIDB4M2YxMDZlYmIgKi8KK3RwaSAgICAgID0gIDYuMzY2MTk3NDY2OWUtMDEsIC8qIDB4M2YyMmY5ODMgKi8KKyAJCS8qIFIwL1MwIG9uIFswLCAyLjAwXSAqLworUjAyICA9ICAxLjU2MjUwMDAwMDBlLTAyLCAvKiAweDNjODAwMDAwICovCitSMDMgID0gLTEuODk5NzkyOTg3NGUtMDQsIC8qIDB4Yjk0NzM1MmUgKi8KK1IwNCAgPSAgMS44Mjk1NDA0NTE2ZS0wNiwgLyogMHgzNWY1OGU4OCAqLworUjA1ICA9IC00LjYxODMyNzA1NDFlLTA5LCAvKiAweGIxOWVhZjNjICovCitTMDEgID0gIDEuNTYxOTEwMjg2NWUtMDIsIC8qIDB4M2M3ZmU3NDQgKi8KK1MwMiAgPSAgMS4xNjkyNjc4NTI3ZS0wNCwgLyogMHgzOGY1MzY5NyAqLworUzAzICA9ICA1LjEzNTQ2NTI0NDJlLTA3LCAvKiAweDM1MDlkYWE2ICovCitTMDQgID0gIDEuMTY2MTQwMDczNGUtMDk7IC8qIDB4MzBhMDQ1ZTggKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfajBmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHIsdSx2OworCWludDMyX3QgaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiBvbmUvKHgqeCk7CisJeCA9IGZhYnNmKHgpOworCWlmKGl4ID49IDB4NDAwMDAwMDApIHsJLyogfHh8ID49IDIuMCAqLworCQlzID0gc2luZih4KTsKKwkJYyA9IGNvc2YoeCk7CisJCXNzID0gcy1jOworCQljYyA9IHMrYzsKKwkJaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSAtY29zZih4K3gpOworCQkgICAgaWYgKChzKmMpPHplcm8pIGNjID0gei9zczsKKwkJICAgIGVsc2UgCSAgICBzcyA9IHovY2M7CisJCX0KKwkvKgorCSAqIGowKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqY2MgLSBRKDAseCkqc3MpIC8gc3FydCh4KQorCSAqIHkwKHgpID0gMS9zcXJ0KHBpKSAqIChQKDAseCkqc3MgKyBRKDAseCkqY2MpIC8gc3FydCh4KQorCSAqLworCQlpZihpeD4weDgwMDAwMDAwKSB6ID0gKGludnNxcnRwaSpjYykvc3FydGYoeCk7CisJCWVsc2UgeworCQkgICAgdSA9IHB6ZXJvZih4KTsgdiA9IHF6ZXJvZih4KTsKKwkJICAgIHogPSBpbnZzcXJ0cGkqKHUqY2Mtdipzcykvc3FydGYoeCk7CisJCX0KKwkJcmV0dXJuIHo7CisJfQorCWlmKGl4PDB4MzkwMDAwMDApIHsJLyogfHh8IDwgMioqLTEzICovCisJICAgIGlmKGh1Z2UreD5vbmUpIHsJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgICAgIGlmKGl4PDB4MzIwMDAwMDApIHJldHVybiBvbmU7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgICAgIGVsc2UgCSAgICAgIHJldHVybiBvbmUgLSAoZmxvYXQpMC4yNSp4Kng7CisJICAgIH0KKwl9CisJeiA9IHgqeDsKKwlyID0gIHoqKFIwMit6KihSMDMreiooUjA0K3oqUjA1KSkpOworCXMgPSAgb25lK3oqKFMwMSt6KihTMDIreiooUzAzK3oqUzA0KSkpOworCWlmKGl4IDwgMHgzRjgwMDAwMCkgewkvKiB8eHwgPCAxLjAwICovCisJICAgIHJldHVybiBvbmUgKyB6KigoZmxvYXQpLTAuMjUrKHIvcykpOworCX0gZWxzZSB7CisJICAgIHUgPSAoZmxvYXQpMC41Kng7CisJICAgIHJldHVybigob25lK3UpKihvbmUtdSkreiooci9zKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgZmxvYXQKK3UwMCAgPSAtNy4zODA0Mjk2NTUzZS0wMiwgLyogMHhiZDk3MjZiNSAqLwordTAxICA9ICAxLjc2NjY2NDUzNDhlLTAxLCAvKiAweDNlMzRlODBkICovCit1MDIgID0gLTEuMzgxODU2NzYxOWUtMDIsIC8qIDB4YmM2MjY3NDYgKi8KK3UwMyAgPSAgMy40NzQ1MzQzMTQ2ZS0wNCwgLyogMHgzOWI2MmE2OSAqLwordTA0ICA9IC0zLjgxNDA3MDYyMzhlLTA2LCAvKiAweGI2N2ZmNTNjICovCit1MDUgID0gIDEuOTU1OTAxMzk2NGUtMDgsIC8qIDB4MzJhODAyYmEgKi8KK3UwNiAgPSAtMy45ODIwNTE4NDEwZS0xMSwgLyogMHhhZTJmMjFlYiAqLwordjAxICA9ICAxLjI3MzA0ODM4OTdlLTAyLCAvKiAweDNjNTA5Mzg1ICovCit2MDIgID0gIDcuNjAwNjg2NTEyOWUtMDUsIC8qIDB4Mzg5ZjY1ZTAgKi8KK3YwMyAgPSAgMi41OTE1MDg1MTg5ZS0wNywgLyogMHgzNDhiMjE2YyAqLwordjA0ICA9ICA0LjQxMTEwMzE0OTRlLTEwOyAvKiAweDJmZjI4MGMyICovCisKK2Zsb2F0CitfX2llZWU3NTRfeTBmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisgICAgICAgIGl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBZMChOYU4pIGlzIE5hTiwgeTAoLWluZikgaXMgTmFuLCB5MChpbmYpIGlzIDAgICovCisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiAgb25lLyh4K3gqeCk7CisgICAgICAgIGlmKGl4PT0wKSByZXR1cm4gLW9uZS96ZXJvOworICAgICAgICBpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworICAgICAgICBpZihpeCA+PSAweDQwMDAwMDAwKSB7ICAvKiB8eHwgPj0gMi4wICovCisgICAgICAgIC8qIHkwKHgpID0gc3FydCgyLyhwaSp4KSkqKHAwKHgpKnNpbih4MCkrcTAoeCkqY29zKHgwKSkKKyAgICAgICAgICogd2hlcmUgeDAgPSB4LXBpLzQKKyAgICAgICAgICogICAgICBCZXR0ZXIgZm9ybXVsYToKKyAgICAgICAgICogICAgICAgICAgICAgIGNvcyh4MCkgPSBjb3MoeCljb3MocGkvNCkrc2luKHgpc2luKHBpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgKyBjb3MoeCkpCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeDApID0gc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgICAgICAgICAqIFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeCkgKy0gY29zKHgpID0gLWNvcygyeCkvKHNpbih4KSAtKyBjb3MoeCkpCisgICAgICAgICAqIHRvIGNvbXB1dGUgdGhlIHdvcnNlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgcyA9IHNpbmYoeCk7CisgICAgICAgICAgICAgICAgYyA9IGNvc2YoeCk7CisgICAgICAgICAgICAgICAgc3MgPSBzLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzK2M7CisJLyoKKwkgKiBqMCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKmNjIC0gUSgwLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MCh4KSA9IDEvc3FydChwaSkgKiAoUCgwLHgpKnNzICsgUSgwLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKyAgICAgICAgICAgICAgICBpZihpeDwweDdmMDAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICB6ID0gLWNvc2YoeCt4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzKmMpPHplcm8pIGNjID0gei9zczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHNzID0gei9jYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoaXg+MHg4MDAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqc3MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcHplcm9mKHgpOyB2ID0gcXplcm9mKHgpOworICAgICAgICAgICAgICAgICAgICB6ID0gaW52c3FydHBpKih1KnNzK3YqY2MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKwl9CisJaWYoaXg8PTB4MzIwMDAwMDApIHsJLyogeCA8IDIqKi0yNyAqLworCSAgICByZXR1cm4odTAwICsgdHBpKl9faWVlZTc1NF9sb2dmKHgpKTsKKwl9CisJeiA9IHgqeDsKKwl1ID0gdTAwK3oqKHUwMSt6Kih1MDIreioodTAzK3oqKHUwNCt6Kih1MDUreip1MDYpKSkpKTsKKwl2ID0gb25lK3oqKHYwMSt6Kih2MDIreioodjAzK3oqdjA0KSkpOworCXJldHVybih1L3YgKyB0cGkqKF9faWVlZTc1NF9qMGYoeCkqX19pZWVlNzU0X2xvZ2YoeCkpKTsKK30KKworLyogVGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBwemVybyBpcworICoJMSAtIDkvMTI4IHNeMiArIDExMDI1Lzk4MzA0IHNeNCAtIC4uLiwJd2hlcmUgcyA9IDEveC4KKyAqIEZvciB4ID49IDIsIFdlIGFwcHJveGltYXRlIHB6ZXJvIGJ5CisgKiAJcHplcm8oeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcFIwICsgcFIxKnNeMiArIHBSMipzXjQgKyAuLi4gKyBwUjUqc14xMAorICogCSAgUyA9IDEgKyBwUzAqc14yICsgLi4uICsgcFM0KnNeMTAKKyAqIGFuZAorICoJfCBwemVybyh4KS0xLVIvUyB8IDw9IDIgICoqICggLTYwLjI2KQorICovCitzdGF0aWMgY29uc3QgZmxvYXQgcFI4WzZdID0geyAvKiBmb3IgeCBpbiBbaW5mLCA4XT0xL1swLDAuMTI1XSAqLworICAwLjAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwICovCisgLTcuMDMxMjUwMDAwMGUtMDIsIC8qIDB4YmQ5MDAwMDAgKi8KKyAtOC4wODE2NzA3NjExZSswMCwgLyogMHhjMTAxNGU4NiAqLworIC0yLjU3MDYzMTEwMzVlKzAyLCAvKiAweGMzODA4ODE0ICovCisgLTIuNDg1MjE2MzA4NmUrMDMsIC8qIDB4YzUxYjUzNzYgKi8KKyAtNS4yNTMwNDM5NDUzZSswMywgLyogMHhjNWE0Mjg1YSAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwUzhbNV0gPSB7CisgIDEuMTY1MzQzNjI3OWUrMDIsIC8qIDB4NDJlOTExOTggKi8KKyAgMy44MzM3NDQ4NzMwZSswMywgLyogMHg0NTZmOWJlYiAqLworICA0LjA1OTc4NTU0NjllKzA0LCAvKiAweDQ3MWU5NWRiICovCisgIDEuMTY3NTI5Njg3NWUrMDUsIC8qIDB4NDdlNDA4N2MgKi8KKyAgNC43NjI3NzI2NTYyZSswNCwgLyogMHg0NzNhMGJiYSAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBwUjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAtMS4xNDEyNTQ2MjU1ZS0xMSwgLyogMHhhZDQ4YzU4YSAqLworIC03LjAzMTI0OTI1NDllLTAyLCAvKiAweGJkOGZmZmZmICovCisgLTQuMTU5NjEwNzQ4M2UrMDAsIC8qIDB4YzA4NTFiODggKi8KKyAtNi43Njc0NzY2NTQxZSswMSwgLyogMHhjMjg3NTk3YiAqLworIC0zLjMxMjMxMjkyNzJlKzAyLCAvKiAweGMzYTU5ZDliICovCisgLTMuNDY0MzMzODAxM2UrMDIsIC8qIDB4YzNhZDM3NzkgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFM1WzVdID0geworICA2LjA3NTM5MzY3NjhlKzAxLCAvKiAweDQyNzMwNDA4ICovCisgIDEuMDUxMjUyMzE5M2UrMDMsIC8qIDB4NDQ4MzY4MTMgKi8KKyAgNS45Nzg5NzA3MDMxZSswMywgLyogMHg0NWJhZDdjNCAqLworICA5LjYyNTQ0NTMxMjVlKzAzLCAvKiAweDQ2MTY2NWM4ICovCisgIDIuNDA2MDU4MTA1NWUrMDMsIC8qIDB4NDUxNjYwZWUgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwUjNbNl0gPSB7LyogZm9yIHggaW4gWzQuNTQ3LDIuODU3MV09MS9bMC4yMTk5LDAuMzUwMDFdICovCisgLTIuNTQ3MDQ1OTA3NWUtMDksIC8qIDB4YjEyZjA4MWIgKi8KKyAtNy4wMzExOTYzNTU4ZS0wMiwgLyogMHhiZDhmZmZiOCAqLworIC0yLjQwOTAzMjEwNjRlKzAwLCAvKiAweGMwMWEyZDk1ICovCisgLTIuMTk2NTk3NjcxNWUrMDEsIC8qIDB4YzFhZmJhNTIgKi8KKyAtNS44MDc5MTcwMjI3ZSswMSwgLyogMHhjMjY4NTExMiAqLworIC0zLjE0NDc5NDY1NDhlKzAxLCAvKiAweGMxZmI5NTY1ICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBTM1s1XSA9IHsKKyAgMy41ODU2MDMzMzI1ZSswMSwgLyogMHg0MjBmNmM5NCAqLworICAzLjYxNTEzOTc3MDVlKzAyLCAvKiAweDQzYjRjMWNhICovCisgIDEuMTkzNjA3Nzg4MWUrMDMsIC8qIDB4NDQ5NTMzNzMgKi8KKyAgMS4xMjc5OTY4MjYyZSswMywgLyogMHg0NDhjZmZlNiAqLworICAxLjczNTgwOTMyNjJlKzAyLCAvKiAweDQzMmQ5NGI4ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcFIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAtOC44NzUzNDMxMjcxZS0wOCwgLyogMHhiM2JlOThiNyAqLworIC03LjAzMDMwOTczNjdlLTAyLCAvKiAweGJkOGZmYjEyICovCisgLTEuNDUwNzM4NDMwMGUrMDAsIC8qIDB4YmZiOWIxY2MgKi8KKyAtNy42MzU2OTU5MzQzZSswMCwgLyogMHhjMGY0NTc5ZiAqLworIC0xLjExOTMxNjY3MzNlKzAxLCAvKiAweGMxMzMxNzM2ICovCisgLTMuMjMzNjQ1Njc3NmUrMDAsIC8qIDB4YzA0ZWY0MGQgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcFMyWzVdID0geworICAyLjIyMjAzMDA2NzRlKzAxLCAvKiAweDQxYjFjMzJkICovCisgIDEuMzYyMDY3ODcxMWUrMDIsIC8qIDB4NDMwODM0ZjAgKi8KKyAgMi43MDQ3MDI3NTg4ZSswMiwgLyogMHg0Mzg3M2MzMiAqLworICAxLjUzODc1Mzk2NzNlKzAyLCAvKiAweDQzMTllMDFhICovCisgIDEuNDY1NzYxNzU2OWUrMDEsIC8qIDB4NDE2YTg1OWEgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcHplcm9mKGZsb2F0IHgpCit7CisJY29uc3QgZmxvYXQgKnAsKnE7CisJZmxvYXQgeixyLHM7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQxMDAwMDAwKSAgICAge3AgPSBwUjg7IHE9IHBTODt9CisJZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHBSNTsgcT0gcFM1O30KKwllbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcFIzOyBxPSBwUzM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBwUjI7IHE9IHBTMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqcVs0XSkpKSk7CisJcmV0dXJuIG9uZSsgci9zOworfQorCisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcXplcm8gaXMKKyAqCS0xLzggcyArIDc1LzEwMjQgc14zIC0gLi4uLCB3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcHplcm8gYnkKKyAqIAlxemVybyh4KSA9IHMqKC0xLjI1ICsgKFIvUykpCisgKiB3aGVyZSAgUiA9IHFSMCArIHFSMSpzXjIgKyBxUjIqc140ICsgLi4uICsgcVI1KnNeMTAKKyAqIAkgIFMgPSAxICsgcVMwKnNeMiArIC4uLiArIHFTNSpzXjEyCisgKiBhbmQKKyAqCXwgcXplcm8oeCkvcyArMS4yNS1SL1MgfCA8PSAyICAqKiAoIC02MS4yMikKKyAqLworc3RhdGljIGNvbnN0IGZsb2F0IHFSOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCAqLworICA3LjMyNDIxODc1MDBlLTAyLCAvKiAweDNkOTYwMDAwICovCisgIDEuMTc2ODIwNjU5NmUrMDEsIC8qIDB4NDEzYzRhOTMgKi8KKyAgNS41NzY3MzQwMDg4ZSswMiwgLyogMHg0NDBiNmIxOSAqLworICA4Ljg1OTE5NzI2NTZlKzAzLCAvKiAweDQ2MGE2Y2NhICovCisgIDMuNzAxNDYyNTAwMGUrMDQsIC8qIDB4NDcxMDk2YTAgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVM4WzZdID0geworICAxLjYzNzc2MDMxNDllKzAyLCAvKiAweDQzMjNjNmFhICovCisgIDguMDk4MzQ0NzI2NmUrMDMsIC8qIDB4NDVmZDEyYzIgKi8KKyAgMS40MjUzODI5Njg4ZSswNSwgLyogMHg0ODBiMzI5MyAqLworICA4LjAzMzA5MjUwMDBlKzA1LCAvKiAweDQ5NDQxZWQ0ICovCisgIDguNDA1MDE1NjI1MGUrMDUsIC8qIDB4NDk0ZDMzNTkgKi8KKyAtMy40Mzg5OTI4MTI1ZSswNSwgLyogMHhjOGE3ZWI2OSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFSNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworICAxLjg0MDg1OTU4MjhlLTExLCAvKiAweDJkYTFlYzc5ICovCisgIDcuMzI0MjE4MDA0OWUtMDIsIC8qIDB4M2Q5NWZmZmYgKi8KKyAgNS44MzU2MzUxODUyZSswMCwgLyogMHg0MGJhYmQ4NiAqLworICAxLjM1MTExNTcyMjdlKzAyLCAvKiAweDQzMDcxYzkwICovCisgIDEuMDI3MjQzNzc0NGUrMDMsIC8qIDB4NDQ4MDY3Y2QgKi8KKyAgMS45ODk5Nzc5MDUzZSswMywgLyogMHg0NGY4YmY0YiAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxUzVbNl0gPSB7CisgIDguMjc3NjYxMTMyOGUrMDEsIC8qIDB4NDJhNThkYTAgKi8KKyAgMi4wNzc4MTQyMDkwZSswMywgLyogMHg0NTAxZGQwNyAqLworICAxLjg4NDcyODkwNjJlKzA0LCAvKiAweDQ2OTMzZTk0ICovCisgIDUuNjc1MTExMzI4MWUrMDQsIC8qIDB4NDc1ZGFmMWQgKi8KKyAgMy41OTc2NzUzOTA2ZSswNCwgLyogMHg0NzBjODhjMSAqLworIC01LjM1NDM0Mjc3MzRlKzAzLCAvKiAweGM1YTc1MmJlICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcVIzWzZdID0gey8qIGZvciB4IGluIFs0LjU0NywyLjg1NzFdPTEvWzAuMjE5OSwwLjM1MDAxXSAqLworICA0LjM3NzQwOTk5MDBlLTA5LCAvKiAweDMxOTY2ODFiICovCisgIDcuMzI0MTExNDYxNmUtMDIsIC8qIDB4M2Q5NWZmNzAgKi8KKyAgMy4zNDQyMzEzNjcxZSswMCwgLyogMHg0MDU2MDdlMyAqLworICA0LjI2MjE4NDUyNDVlKzAxLCAvKiAweDQyMmE3Y2M1ICovCisgIDEuNzA4MDgwOTAyMWUrMDIsIC8qIDB4NDMyYWNlZGYgKi8KKyAgMS42NjczMzk0Nzc1ZSswMiwgLyogMHg0MzI2YmJlNCAqLworfTsKK3N0YXRpYyBjb25zdCBmbG9hdCBxUzNbNl0gPSB7CisgIDQuODc1ODg3Mjk4NmUrMDEsIC8qIDB4NDI0MzA5MTYgKi8KKyAgNy4wOTY4OTIwODk4ZSswMiwgLyogMHg0NDMxNmMxYyAqLworICAzLjcwNDE0ODE5MzRlKzAzLCAvKiAweDQ1Njc4MjVmICovCisgIDYuNDYwNDI1MjkzMGUrMDMsIC8qIDB4NDVjOWUzNjcgKi8KKyAgMi41MTYzMzM3NDAyZSswMywgLyogMHg0NTFkNDU1NyAqLworIC0xLjQ5MjQ3NDUxNzhlKzAyLCAvKiAweGMzMTUzZjU5ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcVIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAgMS41MDQ0NDQ0OTc5ZS0wNywgLyogMHgzNDIxODlkYiAqLworICA3LjMyMjM0MjY5MzhlLTAyLCAvKiAweDNkOTVmNjJhICovCisgIDEuOTk4MTkxNzE0M2UrMDAsIC8qIDB4M2ZmZmM0YmYgKi8KKyAgMS40NDk1NjAyNjA4ZSswMSwgLyogMHg0MTY3ZWRmZCAqLworICAzLjE2NjYyMzExNTVlKzAxLCAvKiAweDQxZmQ1NDcxICovCisgIDEuNjI1MjcwODQzNWUrMDEsIC8qIDB4NDE4MjA1OGMgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcVMyWzZdID0geworICAzLjAzNjU1ODUzMjdlKzAxLCAvKiAweDQxZjJlY2I4ICovCisgIDIuNjkzNDgxMTQwMWUrMDIsIC8qIDB4NDM4NmFjOGYgKi8KKyAgOC40NDc4Mzc1MjQ0ZSswMiwgLyogMHg0NDUzMzIyOSAqLworICA4LjgyOTM1ODUyMDVlKzAyLCAvKiAweDQ0NWNiYmU1ICovCisgIDIuMTI2NjYzODE4NGUrMDIsIC8qIDB4NDM1NGFhOTggKi8KKyAtNS4zMTA5NTUwNDc2ZSswMCwgLyogMHhjMGE5ZjM1OCAqLworfTsKKworCXN0YXRpYyBmbG9hdCBxemVyb2YoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCBzLHIsejsKKwlpbnQzMl90IGl4OworCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDEwMDAwMDApICAgICB7cCA9IHFSODsgcT0gcVM4O30KKwllbHNlIGlmKGl4Pj0weDQwZjcxYzU4KXtwID0gcVI1OyBxPSBxUzU7fQorCWVsc2UgaWYoaXg+PTB4NDAzNmRiNjgpe3AgPSBxUjM7IHE9IHFTMzt9CisJZWxzZSBpZihpeD49MHg0MDAwMDAwMCl7cCA9IHFSMjsgcT0gcVMyO30KKwl6ID0gb25lLyh4KngpOworCXIgPSBwWzBdK3oqKHBbMV0reioocFsyXSt6KihwWzNdK3oqKHBbNF0reipwWzVdKSkpKTsKKwlzID0gb25lK3oqKHFbMF0reioocVsxXSt6KihxWzJdK3oqKHFbM10reioocVs0XSt6KnFbNV0pKSkpKTsKKwlyZXR1cm4gKC0oZmxvYXQpLjEyNSArIHIvcykveDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfajEuYyBiL2xpYm0vc3JjL2VfajEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJmMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qMS5jCkBAIC0wLDAgKzEsMzc3IEBACisKKy8qIEAoIyllX2oxLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfajEuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2oxKHgpLCBfX2llZWU3NTRfeTEoeCkKKyAqIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBraW5kcyBvZiBvcmRlciB6ZXJvLgorICogTWV0aG9kIC0tIGoxKHgpOgorICoJMS4gRm9yIHRpbnkgeCwgd2UgdXNlIGoxKHgpID0geC8yIC0geF4zLzE2ICsgeF41LzM4NCAtIC4uLgorICoJMi4gUmVkdWNlIHggdG8gfHh8IHNpbmNlIGoxKHgpPS1qMSgteCksICBhbmQKKyAqCSAgIGZvciB4IGluICgwLDIpCisgKgkJajEoeCkgPSB4LzIgKyB4KnoqUjAvUzAsICB3aGVyZSB6ID0geCp4OworICoJICAgKHByZWNpc2lvbjogIHxqMS94IC0gMS8yIC0gUjAvUzAgfDwyKiotNjEuNTEgKQorICoJICAgZm9yIHggaW4gKDIsaW5mKQorICogCQlqMSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpjb3MoeDEpLXExKHgpKnNpbih4MSkpCisgKiAJCXkxKHgpID0gc3FydCgyLyhwaSp4KSkqKHAxKHgpKnNpbih4MSkrcTEoeCkqY29zKHgxKSkKKyAqIAkgICB3aGVyZSB4MSA9IHgtMypwaS80LiBJdCBpcyBiZXR0ZXIgdG8gY29tcHV0ZSBzaW4oeDEpLGNvcyh4MSkKKyAqCSAgIGFzIGZvbGxvdzoKKyAqCQljb3MoeDEpID0gIGNvcyh4KWNvcygzcGkvNCkrc2luKHgpc2luKDNwaS80KQorICoJCQk9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICoJCXNpbih4MSkgPSAgc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgKgkJCT0gLTEvc3FydCgyKSAqIChzaW4oeCkgKyBjb3MoeCkpCisgKiAJICAgKFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgKgkJc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICogCSAgICB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuKQorICoJICAgCisgKgkzIFNwZWNpYWwgY2FzZXMKKyAqCQlqMShuYW4pPSBuYW4KKyAqCQlqMSgwKSA9IDAKKyAqCQlqMShpbmYpID0gMAorICoJCQorICogTWV0aG9kIC0tIHkxKHgpOgorICoJMS4gc2NyZWVuIG91dCB4PD0wIGNhc2VzOiB5MSgwKT0taW5mLCB5MSh4PDApPU5hTiAKKyAqCTIuIEZvciB4PDIuCisgKgkgICBTaW5jZSAKKyAqCQl5MSh4KSA9IDIvcGkqKGoxKHgpKihsbih4LzIpK0V1bGVyKS0xL3gteC8yKzUvNjQqeF4zLS4uLikKKyAqCSAgIHRoZXJlZm9yZSB5MSh4KS0yL3BpKmoxKHgpKmxuKHgpLTEveCBpcyBhbiBvZGQgZnVuY3Rpb24uCisgKgkgICBXZSB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBhcHByb3hpbWF0ZSB5MSwKKyAqCQl5MSh4KSA9IHgqVSh6KS9WKHopICsgKDIvcGkpKihqMSh4KSpsbih4KS0xL3gpLCB6PSB4XjIKKyAqCSAgIHdoZXJlIGZvciB4IGluIFswLDJdIChhYnMgZXJyIGxlc3MgdGhhbiAyKiotNjUuODkpCisgKgkJVSh6KSA9IFUwWzBdICsgVTBbMV0qeiArIC4uLiArIFUwWzRdKnpeNAorICoJCVYoeikgPSAxICArIHYwWzBdKnogKyAuLi4gKyB2MFs0XSp6XjUKKyAqCSAgIE5vdGU6IEZvciB0aW55IHgsIDEveCBkb21pbmF0ZSB5MSBhbmQgaGVuY2UKKyAqCQl5MSh0aW55KSA9IC0yL3BpL3RpbnksIChjaG9vc2UgdGlueTwyKiotNTQpCisgKgkzLiBGb3IgeD49Mi4KKyAqIAkJeTEoeCkgPSBzcXJ0KDIvKHBpKngpKSoocDEoeCkqc2luKHgxKStxMSh4KSpjb3MoeDEpKQorICogCSAgIHdoZXJlIHgxID0geC0zKnBpLzQuIEl0IGlzIGJldHRlciB0byBjb21wdXRlIHNpbih4MSksY29zKHgxKQorICoJICAgYnkgbWV0aG9kIG1lbnRpb25lZCBhYm92ZS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgZG91YmxlIHBvbmUoZG91YmxlKSwgcW9uZShkb3VibGUpOworCitzdGF0aWMgY29uc3QgZG91YmxlCitodWdlICAgID0gMWUzMDAsCitvbmUJPSAxLjAsCitpbnZzcXJ0cGk9ICA1LjY0MTg5NTgzNTQ3NzU2Mjc5MjgwZS0wMSwgLyogMHgzRkUyMERENywgMHg1MDQyOUI2RCAqLwordHBpICAgICAgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KKwkvKiBSMC9TMCBvbiBbMCwyXSAqLworcjAwICA9IC02LjI1MDAwMDAwMDAwMDAwMDAwMDAwZS0wMiwgLyogMHhCRkIwMDAwMCwgMHgwMDAwMDAwMCAqLworcjAxICA9ICAxLjQwNzA1NjY2OTU1MTg5NzA2MDQ4ZS0wMywgLyogMHgzRjU3MEQ5RiwgMHg5ODQ3MkM2MSAqLworcjAyICA9IC0xLjU5OTU1NjMxMDg0MDM1NTk3NTIwZS0wNSwgLyogMHhCRUYwQzVDNiwgMHhCQTE2OTY2OCAqLworcjAzICA9ICA0Ljk2NzI3OTk5NjA5NTg0NDQ4NDEyZS0wOCwgLyogMHgzRTZBQUFGQSwgMHg0NkNBMEJEOSAqLworczAxICA9ICAxLjkxNTM3NTk5NTM4MzYzNDYwODA1ZS0wMiwgLyogMHgzRjkzOUQwQiwgMHgxMjYzN0U1MyAqLworczAyICA9ICAxLjg1OTQ2Nzg1NTg4NjMwOTE1NTYwZS0wNCwgLyogMHgzRjI4NUY1NiwgMHhCOUNERjY2NCAqLworczAzICA9ICAxLjE3NzE4NDY0MDQyNjIzNjgzMjYzZS0wNiwgLyogMHgzRUIzQkZGOCwgMHgzMzNGODQ5OCAqLworczA0ICA9ICA1LjA0NjM2MjU3MDc2MjE3MDQyNzE1ZS0wOSwgLyogMHgzRTM1QUM4OCwgMHhDOTdERkYyQyAqLworczA1ICA9ICAxLjIzNTQyMjc0NDI2MTM3OTEzOTA4ZS0xMTsgLyogMHgzREFCMkFDRiwgMHhDRkI5N0VEOCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gICAgPSAwLjA7CisKK2RvdWJsZQorX19pZWVlNzU0X2oxKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2Mscix1LHYseTsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiBvbmUveDsKKwl5ID0gZmFicyh4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbih5KTsKKwkJYyA9IGNvcyh5KTsKKwkJc3MgPSAtcy1jOworCQljYyA9IHMtYzsKKwkJaWYoaXg8MHg3ZmUwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHkreSBub3Qgb3ZlcmZsb3cgKi8KKwkJICAgIHogPSBjb3MoeSt5KTsKKwkJICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKmNjIC0gUSgxLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKnNzICsgUSgxLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnQoeSk7CisJCWVsc2UgeworCQkgICAgdSA9IHBvbmUoeSk7IHYgPSBxb25lKHkpOworCQkgICAgeiA9IGludnNxcnRwaSoodSpjYy12KnNzKS9zcXJ0KHkpOworCQl9CisJCWlmKGh4PDApIHJldHVybiAtejsKKwkJZWxzZSAgCSByZXR1cm4gIHo7CisJfQorCWlmKGl4PDB4M2U0MDAwMDApIHsJLyogfHh8PDIqKi0yNyAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4gMC41Kng7LyogaW5leGFjdCBpZiB4IT0wIG5lY2Vzc2FyeSAqLworCX0KKwl6ID0geCp4OworCXIgPSAgeioocjAwK3oqKHIwMSt6KihyMDIreipyMDMpKSk7CisJcyA9ICBvbmUreiooczAxK3oqKHMwMit6KihzMDMreiooczA0K3oqczA1KSkpKTsKKwlyICo9IHg7CisJcmV0dXJuKHgqMC41K3Ivcyk7Cit9CisKK3N0YXRpYyBjb25zdCBkb3VibGUgVTBbNV0gPSB7CisgLTEuOTYwNTcwOTA2NDYyMzg5NDA2NjhlLTAxLCAvKiAweEJGQzkxODY2LCAweDE0M0NCQzhBICovCisgIDUuMDQ0Mzg3MTY2Mzk4MTEyODI2MTZlLTAyLCAvKiAweDNGQTlEM0M3LCAweDc2MjkyQ0QxICovCisgLTEuOTEyNTY4OTU4NzU3NjM1NDcyOThlLTAzLCAvKiAweEJGNUY1NUU1LCAweDQ4NDRGNTBGICovCisgIDIuMzUyNTI2MDA1NjE2MTA0OTU5MjhlLTA1LCAvKiAweDNFRjhBQjAzLCAweDhGQTZCODhFICovCisgLTkuMTkwOTkxNTgwMzk4Nzg4NzQ1MDRlLTA4LCAvKiAweEJFNzhBQzAwLCAweDU2OTEwNUI4ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBWMFs1XSA9IHsKKyAgMS45OTE2NzMxODIzNjY0OTkwMzk3M2UtMDIsIC8qIDB4M0Y5NDY1MEQsIDB4M0Y0REE5RjAgKi8KKyAgMi4wMjU1MjU4MTAyNTEzNTE3MTQ5NmUtMDQsIC8qIDB4M0YyQThDODksIDB4NkMyNTc3NjQgKi8KKyAgMS4zNTYwODgwMTA5NzUxNjIyOTQwNGUtMDYsIC8qIDB4M0VCNkMwNUEsIDB4ODk0RThDQTYgKi8KKyAgNi4yMjc0MTQ1MjM2NDYyMTUwMTI5NWUtMDksIC8qIDB4M0UzQUJGMUQsIDB4NUJBNjlBODYgKi8KKyAgMS42NjU1OTI0NjIwNzk5MjA3OTExNGUtMTEsIC8qIDB4M0RCMjUwMzksIDB4REFDQTc3MkEgKi8KK307CisKK2RvdWJsZQorX19pZWVlNzU0X3kxKGRvdWJsZSB4KQoreworCWRvdWJsZSB6LCBzLGMsc3MsY2MsdSx2OworCWludDMyX3QgaHgsaXgsbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworICAgICAgICBpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWTEoTmFOKSBpcyBOYU4sIFkxKC1pbmYpIGlzIE5hTiwgWTEoaW5mKSBpcyAwICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiAgb25lLyh4K3gqeCk7IAorICAgICAgICBpZigoaXh8bHgpPT0wKSByZXR1cm4gLW9uZS96ZXJvOworICAgICAgICBpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworICAgICAgICBpZihpeCA+PSAweDQwMDAwMDAwKSB7ICAvKiB8eHwgPj0gMi4wICovCisgICAgICAgICAgICAgICAgcyA9IHNpbih4KTsKKyAgICAgICAgICAgICAgICBjID0gY29zKHgpOworICAgICAgICAgICAgICAgIHNzID0gLXMtYzsKKyAgICAgICAgICAgICAgICBjYyA9IHMtYzsKKyAgICAgICAgICAgICAgICBpZihpeDwweDdmZTAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeCt4IG5vdCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICB6ID0gY29zKHgreCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBzcyA9IHovY2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAvKiB5MSh4KSA9IHNxcnQoMi8ocGkqeCkpKihwMSh4KSpzaW4oeDApK3ExKHgpKmNvcyh4MCkpCisgICAgICAgICAqIHdoZXJlIHgwID0geC0zcGkvNAorICAgICAgICAgKiAgICAgIEJldHRlciBmb3JtdWxhOgorICAgICAgICAgKiAgICAgICAgICAgICAgY29zKHgwKSA9IGNvcyh4KWNvcygzcGkvNCkrc2luKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9ICAxL3NxcnQoMikgKiAoc2luKHgpIC0gY29zKHgpKQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgwKSA9IHNpbih4KWNvcygzcGkvNCktY29zKHgpc2luKDNwaS80KQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IC0xL3NxcnQoMikgKiAoY29zKHgpICsgc2luKHgpKQorICAgICAgICAgKiBUbyBhdm9pZCBjYW5jZWxsYXRpb24sIHVzZQorICAgICAgICAgKiAgICAgICAgICAgICAgc2luKHgpICstIGNvcyh4KSA9IC1jb3MoMngpLyhzaW4oeCkgLSsgY29zKHgpKQorICAgICAgICAgKiB0byBjb21wdXRlIHRoZSB3b3JzZSBvbmUuCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKGl4PjB4NDgwMDAwMDApIHogPSAoaW52c3FydHBpKnNzKS9zcXJ0KHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcG9uZSh4KTsgdiA9IHFvbmUoeCk7CisgICAgICAgICAgICAgICAgICAgIHogPSBpbnZzcXJ0cGkqKHUqc3MrdipjYykvc3FydCh4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0gCisgICAgICAgIGlmKGl4PD0weDNjOTAwMDAwKSB7ICAgIC8qIHggPCAyKiotNTQgKi8KKyAgICAgICAgICAgIHJldHVybigtdHBpL3gpOworICAgICAgICB9IAorICAgICAgICB6ID0geCp4OworICAgICAgICB1ID0gVTBbMF0reiooVTBbMV0reiooVTBbMl0reiooVTBbM10reipVMFs0XSkpKTsKKyAgICAgICAgdiA9IG9uZSt6KihWMFswXSt6KihWMFsxXSt6KihWMFsyXSt6KihWMFszXSt6KlYwWzRdKSkpKTsKKyAgICAgICAgcmV0dXJuKHgqKHUvdikgKyB0cGkqKF9faWVlZTc1NF9qMSh4KSpfX2llZWU3NTRfbG9nKHgpLW9uZS94KSk7Cit9CisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcG9uZSBpcworICoJMSArIDE1LzEyOCBzXjIgLSA0NzI1LzJeMTUgc140IC0gLi4uLAl3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXBvbmUoeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcHIwICsgcHIxKnNeMiArIHByMipzXjQgKyAuLi4gKyBwcjUqc14xMAorICogCSAgUyA9IDEgKyBwczAqc14yICsgLi4uICsgcHM0KnNeMTAKKyAqIGFuZAorICoJfCBwb25lKHgpLTEtUi9TIHwgPD0gMiAgKiogKCAtNjAuMDYpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCisgIDEuMTcxODc0OTk5OTk5ODg2NDc5NzBlLTAxLCAvKiAweDNGQkRGRkZGLCAweEZGRkZGQ0NFICovCisgIDEuMzIzOTQ4MDY1OTMwNzM1NzUxMjllKzAxLCAvKiAweDQwMkE3QTlELCAweDM1N0Y3RkNFICovCisgIDQuMTIwNTE4NTQzMDczNzg1NjIyMjVlKzAyLCAvKiAweDQwNzlDMEQ0LCAweDY1MkVBNTkwICovCisgIDMuODc0NzQ1Mzg5MTM5NjA1MzIyMjdlKzAzLCAvKiAweDQwQUU0NTdELCAweEEzQTUzMkNDICovCisgIDcuOTE0NDc5NTQwMzE4OTE3MzE1NzRlKzAzLCAvKiAweDQwQkVFQTdBLCAweEMzMjc4MkREICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczhbNV0gPSB7CisgIDEuMTQyMDczNzAzNzU2Nzg0MDg0MzZlKzAyLCAvKiAweDQwNUM4RDQ1LCAweDhFNjU2Q0FDICovCisgIDMuNjUwOTMwODM0MjA4NTM0NjMzOTRlKzAzLCAvKiAweDQwQUM4NURDLCAweDk2NEQyNzRGICovCisgIDMuNjk1NjIwNjAyNjkwMzM0NjM1NTVlKzA0LCAvKiAweDQwRTIwQjg2LCAweDk3QzVCQjdGICovCisgIDkuNzYwMjc5MzU5MzQ5NTA4MDEzMTFlKzA0LCAvKiAweDQwRjdENDJDLCAweEIyOEYxN0JCICovCisgIDMuMDgwNDI3MjA2Mjc4ODg4MTE1NzhlKzA0LCAvKiAweDQwREUxNTExLCAweDY5N0EwQjJEICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHByNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworICAxLjMxOTkwNTE5NTU2MjQzNTIyNzQ5ZS0xMSwgLyogMHgzREFEMDY2NywgMHhEQUUxQ0E3RCAqLworICAxLjE3MTg3NDkzMTkwNjE0MDk3NjM4ZS0wMSwgLyogMHgzRkJERkZGRiwgMHhFMkMxMDA0MyAqLworICA2LjgwMjc1MTI3ODY4NDMyODcxNzM2ZSswMCwgLyogMHg0MDFCMzYwNCwgMHg2RTYzMTVFMyAqLworICAxLjA4MzA4MTgyOTkwMTg5MTA5NzczZSswMiwgLyogMHg0MDVCMTNCOSwgMHg0NTI2MDJFRCAqLworICA1LjE3NjM2MTM5NTMzMTk5NzUyODA1ZSswMiwgLyogMHg0MDgwMkQxNiwgMHhEMDUyRDY0OSAqLworICA1LjI4NzE1MjAxMzYzMzM3NTQxODA3ZSswMiwgLyogMHg0MDgwODVCOCwgMHhCQjdFMENCNyAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHM1WzVdID0geworICA1LjkyODA1OTg3MjIxMTMxMzMxOTIxZSswMSwgLyogMHg0MDREQTNFQSwgMHhBOEFGNjMzRCAqLworICA5LjkxNDAxNDE4NzMzNjE0Mzc3NzQzZSswMiwgLyogMHg0MDhFRkIzNiwgMHgxQjA2NjcwMSAqLworICA1LjM1MzI2Njk1MjkxNDg3OTc2NjQ3ZSswMywgLyogMHg0MEI0RTk0NCwgMHg1NzA2QjZGQiAqLworICA3Ljg0NDY5MDMxNzQ5NTUxMjMxNzY5ZSswMywgLyogMHg0MEJFQTRCMCwgMHhCOEE1QkIxNSAqLworICAxLjUwNDA0Njg4ODEwMzYxMDYyNjc5ZSswMywgLyogMHg0MDk3ODAzMCwgMHgwMzZGNUU1MSAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBwcjNbNl0gPSB7CisgIDMuMDI1MDM5MTYxMzczNzM2MTgwMjRlLTA5LCAvKiAweDNFMjlGQzIxLCAweEE3QUQ5RUREICovCisgIDEuMTcxODY4NjU1NjcyNTM1OTI0OTFlLTAxLCAvKiAweDNGQkRGRkY1LCAweDVCMjFEMTdCICovCisgIDMuOTMyOTc3NTAwMzMzMTU2NDA2NTBlKzAwLCAvKiAweDQwMEY3NkJDLCAweEU4NUVBRDhBICovCisgIDMuNTExOTQwMzU1OTE2MzY5MzI3MzZlKzAxLCAvKiAweDQwNDE4RjQ4LCAweDlEQTZEMTI5ICovCisgIDkuMTA1NTAxMTA3NTA3ODEyNzE5MThlKzAxLCAvKiAweDQwNTZDMzg1LCAweDREMkMxODM3ICovCisgIDQuODU1OTA2ODUxOTczNjQ5MTk2NDVlKzAxLCAvKiAweDQwNDg0NzhGLCAweDhFQTgzRUU1ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczNbNV0gPSB7CisgIDMuNDc5MTMwOTUwMDEyNTE1MTk5ODllKzAxLCAvKiAweDQwNDE2NTQ5LCAweEExMzQwNjlDICovCisgIDMuMzY3NjI0NTg3NDc4MjU3NDY3NDFlKzAyLCAvKiAweDQwNzUwQzMzLCAweDA3RjFBNzVGICovCisgIDEuMDQ2ODcxMzk5NzU3NzUxMzA1NTFlKzAzLCAvKiAweDQwOTA1QjdDLCAweDUwMzdENTIzICovCisgIDguOTA4MTEzNDYzOTgyNTY0MzI2MjJlKzAyLCAvKiAweDQwOEJENjdELCAweEEzMkUzMUU5ICovCisgIDEuMDM3ODc5MzI0Mzk2MzkyNzc1MDRlKzAyLCAvKiAweDQwNTlGMjZELCAweDdDMkVFRDUzICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHByMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgIDEuMDc3MTA4MzAxMDY4NzM3NDMwODJlLTA3LCAvKiAweDNFN0NFOUQ0LCAweEY2NTU0NEY0ICovCisgIDEuMTcxNzYyMTk0NjI2ODMzNDgwOTRlLTAxLCAvKiAweDNGQkRGRjQyLCAweEJFNzYwRDgzICovCisgIDIuMzY4NTE0OTY2Njc2MDg3ODUxNzRlKzAwLCAvKiAweDQwMDJGMkI3LCAweEY5OEZBRUMwICovCisgIDEuMjI0MjYxMDkxNDgyNjEyMzI5MTdlKzAxLCAvKiAweDQwMjg3QzM3LCAweDdGNzFBOTY0ICovCisgIDEuNzY5Mzk3MTEyNzE2ODc3MjczOTBlKzAxLCAvKiAweDQwMzFCMUE4LCAweDE3N0Y4RUUyICovCisgIDUuMDczNTIzMTI1ODg4MTg0OTkyNTBlKzAwLCAvKiAweDQwMTQ0QjQ5LCAweEE1NzRDMUZFICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBwczJbNV0gPSB7CisgIDIuMTQzNjQ4NTkzNjM4MjE0MDk0ODhlKzAxLCAvKiAweDQwMzU2RkJELCAweDhBRDVFQ0RDICovCisgIDEuMjUyOTAyMjcxNjg0MDI3NTEwOTBlKzAyLCAvKiAweDQwNUY1MjkzLCAweDE0RjkyQ0Q1ICovCisgIDIuMzIyNzY0NjkwNTcxNjI4MTM2NjllKzAyLCAvKiAweDQwNkQwOEQ4LCAweEQ1QTJEQkQ5ICovCisgIDEuMTc2NzkzNzMyODcxNDcxMDA3NjhlKzAyLCAvKiAweDQwNUQ2QjdBLCAweERBMTg4NEE5ICovCisgIDguMzY0NjM4OTMzNzE2MTgyODMzNjhlKzAwLCAvKiAweDQwMjBCQUIxLCAweEY0NEU1MTkyICovCit9OworCisJc3RhdGljIGRvdWJsZSBwb25lKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgeixyLHM7CisgICAgICAgIGludDMyX3QgaXg7CisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworICAgICAgICBpZihpeD49MHg0MDIwMDAwMCkgICAgIHtwID0gcHI4OyBxPSBwczg7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMTIyRThCKXtwID0gcHI1OyBxPSBwczU7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDZEQjZEKXtwID0gcHIzOyBxPSBwczM7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcHIyOyBxPSBwczI7fQorICAgICAgICB6ID0gb25lLyh4KngpOworICAgICAgICByID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisgICAgICAgIHMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KnFbNF0pKSkpOworICAgICAgICByZXR1cm4gb25lKyByL3M7Cit9CisJCQorCisvKiBGb3IgeCA+PSA4LCB0aGUgYXN5bXB0b3RpYyBleHBhbnNpb25zIG9mIHFvbmUgaXMKKyAqCTMvOCBzIC0gMTA1LzEwMjQgc14zIC0gLi4uLCB3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXFvbmUoeCkgPSBzKigwLjM3NSArIChSL1MpKQorICogd2hlcmUgIFIgPSBxcjEqc14yICsgcXIyKnNeNCArIC4uLiArIHFyNSpzXjEwCisgKiAJICBTID0gMSArIHFzMSpzXjIgKyAuLi4gKyBxczYqc14xMgorICogYW5kCisgKgl8IHFvbmUoeCkvcyAtMC4zNzUtUi9TIHwgPD0gMiAgKiogKCAtNjEuMTMpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDAwMDAwMDAwLCAweDAwMDAwMDAwICovCisgLTEuMDI1MzkwNjI0OTk5OTI3MTQxNjFlLTAxLCAvKiAweEJGQkEzRkZGLCAweEZGRkZGREYzICovCisgLTEuNjI3MTc1MzQ1NDQ1ODk5ODc4ODhlKzAxLCAvKiAweEMwMzA0NTkxLCAweEEyNjc3OUY3ICovCisgLTcuNTk2MDE3MjI1MTM5NTAxMDc4OTZlKzAyLCAvKiAweEMwODdCQ0QwLCAweDUzRTRCNTc2ICovCisgLTEuMTg0OTgwNjY3MDI0Mjk1ODcxNjdlKzA0LCAvKiAweEMwQzcyNEU3LCAweDQwRjg3NDE1ICovCisgLTQuODQzODUxMjQyODU3NTAzNTMwMTBlKzA0LCAvKiAweEMwRTdBNkQwLCAweDY1RDA5QzZBICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczhbNl0gPSB7CisgIDEuNjEzOTUzNjk3MDA3MjI5MDk1NTZlKzAyLCAvKiAweDQwNjQyQ0E2LCAweERFNUJDREU1ICovCisgIDcuODI1Mzg1OTk5MjMzNDg0NjUzODFlKzAzLCAvKiAweDQwQkU5MTYyLCAweEQwRDg4NDE5ICovCisgIDEuMzM4NzUzMzYyODcyNDk1NzgxNjNlKzA1LCAvKiAweDQxMDA1NzlBLCAweEIwQjc1RTk4ICovCisgIDcuMTk2NTc3MjM2ODMyNDA5Mzk4NjNlKzA1LCAvKiAweDQxMjVGNjUzLCAweDcyODY5QzE5ICovCisgIDYuNjY2MDEyMzI2MTc3NzYzNzUyNjRlKzA1LCAvKiAweDQxMjQ1N0QyLCAweDc3MTlBRDVDICovCisgLTIuOTQ0OTAyNjQzMDM4MzQ2NDMyMTVlKzA1LCAvKiAweEMxMTFGOTY5LCAweDBFQTVBQTE4ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHFyNVs2XSA9IHsgLyogZm9yIHggaW4gWzgsNC41NDU0XT0xL1swLjEyNSwwLjIyMDAxXSAqLworIC0yLjA4OTc5OTMxMTQxNzY0MTA0Mjk3ZS0xMSwgLyogMHhCREI2RkE0MywgMHgxQUExQTA5OCAqLworIC0xLjAyNTM5MDUwMjQxMzc1NDI2MjMxZS0wMSwgLyogMHhCRkJBM0ZGRiwgMHhDQjU5N0ZFRiAqLworIC04LjA1NjQ0ODI4MTIzOTM2MDI5ODQwZSswMCwgLyogMHhDMDIwMUNFNiwgMHhDQTAzQUQ0QiAqLworIC0xLjgzNjY5NjA3NDc0ODg4MzgwMjM5ZSswMiwgLyogMHhDMDY2RjU2RCwgMHg2Q0E3QjlCMCAqLworIC0xLjM3MzE5Mzc2MDY1NTA4MTYzMjY1ZSswMywgLyogMHhDMDk1NzRDNiwgMHg2OTMxNzM0RiAqLworIC0yLjYxMjQ0NDQwNDUzMjE1NjU2ODE3ZSswMywgLyogMHhDMEE0NjhFMywgMHg4OEZEQTc5RCAqLworfTsKK3N0YXRpYyBjb25zdCBkb3VibGUgcXM1WzZdID0geworICA4LjEyNzY1NTAxMzg0MzM1Nzc3ODU3ZSswMSwgLyogMHg0MDU0NTFCMiwgMHhGRjVBMTFCMiAqLworICAxLjk5MTc5ODczNDYwNDg1OTY0NjQyZSswMywgLyogMHg0MDlGMUYzMSwgMHhFNzdCRjgzOSAqLworICAxLjc0Njg0ODUxOTI0OTA4OTA3Njc3ZSswNCwgLyogMHg0MEQxMEYxRiwgMHgwRDY0Q0UyOSAqLworICA0Ljk4NTE0MjcwOTEwMzUyMjc5MzE2ZSswNCwgLyogMHg0MEU4NTc2RCwgMHhBQUJBRDE5NyAqLworICAyLjc5NDgwNzUxNjM4OTE4MTE4MjYwZSswNCwgLyogMHg0MERCNEIwNCwgMHhDRjdDMzY0QiAqLworIC00LjcxOTE4MzU0Nzk1MTI4NDcwODY5ZSswMywgLyogMHhDMEIyNkYyRSwgMHhGQ0ZGQTAwNCAqLworfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBxcjNbNl0gPSB7CisgLTUuMDc4MzEyMjY0NjE3NjY1NjEzNjllLTA5LCAvKiAweEJFMzVDRkE5LCAweEQzOEZDODRGICovCisgLTEuMDI1Mzc4Mjk4MjA4MzcwODk3NDVlLTAxLCAvKiAweEJGQkEzRkVCLCAweDUxQUVFRDU0ICovCisgLTQuNjEwMTE1ODExMzk0NzM0MDMxMTNlKzAwLCAvKiAweEMwMTI3MEMyLCAweDMzMDJEOUZGICovCisgLTUuNzg0NzIyMTY1NjI3ODM2NDMyMTJlKzAxLCAvKiAweEMwNENFQzcxLCAweEMyNUQxNkRBICovCisgLTIuMjgyNDQ1NDA3Mzc2MzE2OTUwMzhlKzAyLCAvKiAweEMwNkM4N0QzLCAweDQ3MThENTVGICovCisgLTIuMTkyMTAxMjg0Nzg5MDkzMjU2MjJlKzAyLCAvKiAweEMwNkI2NkI5LCAweDVGNUMxQkY2ICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczNbNl0gPSB7CisgIDQuNzY2NTE1NTAzMjM3Mjk1MDkyNzNlKzAxLCAvKiAweDQwNDdENTIzLCAweENDRDM2N0U0ICovCisgIDYuNzM4NjUxMTI2NzY2OTk3MDk0ODJlKzAyLCAvKiAweDQwODUwRUVCLCAweEMwMzFFRTNFICovCisgIDMuMzgwMTUyODY2Nzk1MjYzNDM1MDVlKzAzLCAvKiAweDQwQUE2ODRFLCAweDQ0OEU3QzlBICovCisgIDUuNTQ3NzI5MDk3MjA3MjI3ODIzNjdlKzAzLCAvKiAweDQwQjVBQkJBLCAweEE2MUQ1NEE2ICovCisgIDEuOTAzMTE5MTkzMzg4MTA3OTg3NjNlKzAzLCAvKiAweDQwOURCQzdBLCAweDBERDRERjRCICovCisgLTEuMzUyMDExOTE0NDQzMDczNDA4MTdlKzAyLCAvKiAweEMwNjBFNjcwLCAweDI5MEEzMTFGICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIHFyMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTEuNzgzODE3Mjc1MTA5NTg4NjU1NzJlLTA3LCAvKiAweEJFODdGMTI2LCAweDQ0QzYyNkQyICovCisgLTEuMDI1MTcwNDI2MDc5ODU1NTM0NjBlLTAxLCAvKiAweEJGQkEzRThFLCAweDkxNDhCMDEwICovCisgLTIuNzUyMjA1NjgyNzgxODc0NjA3MjBlKzAwLCAvKiAweEMwMDYwNDg0LCAweDY5QkI0RURBICovCisgLTEuOTY2MzYxNjI2NDM3MDM3MjAyMjFlKzAxLCAvKiAweEMwMzNBOUUyLCAweEMxNjg5MDdGICovCisgLTQuMjMyNTMxMzMzNzI4MzA0OTAwODllKzAxLCAvKiAweEMwNDUyOUEzLCAweERFMTA0QUFBICovCisgLTIuMTM3MTkyMTE3MDM3MDQwNjE3MzNlKzAxLCAvKiAweEMwMzU1RjM2LCAweDM5Q0Y2RTUyICovCit9Oworc3RhdGljIGNvbnN0IGRvdWJsZSBxczJbNl0gPSB7CisgIDIuOTUzMzM2MjkwNjA1MjM4NTQ1NDhlKzAxLCAvKiAweDQwM0Q4ODhBLCAweDc4QUU2NEZGICovCisgIDIuNTI5ODE1NDk5ODIxOTA1MjkxMzZlKzAyLCAvKiAweDQwNkY5RjY4LCAweERCODIxQ0JBICovCisgIDcuNTc1MDI4MzQ4Njg2NDU0MzY0NzJlKzAyLCAvKiAweDQwODdBQzA1LCAweENFNDlBMEY3ICovCisgIDcuMzkzOTMyMDUzMjA0NjcyNDU2NTZlKzAyLCAvKiAweDQwODcxQjI1LCAweDQ4RDRDMDI5ICovCisgIDEuNTU5NDkwMDMzMzY2NjYxMjM2ODdlKzAyLCAvKiAweDQwNjM3RTVFLCAweDNDM0VEOEQ0ICovCisgLTQuOTU5NDk4OTg4MjI2MjgyMTAxMjdlKzAwLCAvKiAweEMwMTNENjg2LCAweEU3MUJFODZCICovCit9OworCisJc3RhdGljIGRvdWJsZSBxb25lKGRvdWJsZSB4KQoreworCWNvbnN0IGRvdWJsZSAqcCwqcTsKKwlkb3VibGUgIHMscix6OworCWludDMyX3QgaXg7CisJR0VUX0hJR0hfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQwMjAwMDAwKSAgICAge3AgPSBxcjg7IHE9IHFzODt9CisJZWxzZSBpZihpeD49MHg0MDEyMkU4Qil7cCA9IHFyNTsgcT0gcXM1O30KKwllbHNlIGlmKGl4Pj0weDQwMDZEQjZEKXtwID0gcXIzOyBxPSBxczM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBxcjI7IHE9IHFzMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqKHFbNF0reipxWzVdKSkpKSk7CisJcmV0dXJuICguMzc1ICsgci9zKS94OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9qMWYuYyBiL2xpYm0vc3JjL2VfajFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5Mzk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfajFmLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIGVfajFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2oxLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2oxZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgZmxvYXQgcG9uZWYoZmxvYXQpLCBxb25lZihmbG9hdCk7CisKK3N0YXRpYyBjb25zdCBmbG9hdAoraHVnZSAgICA9IDFlMzAsCitvbmUJPSAxLjAsCitpbnZzcXJ0cGk9ICA1LjY0MTg5NjEyODdlLTAxLCAvKiAweDNmMTA2ZWJiICovCit0cGkgICAgICA9ICA2LjM2NjE5NzQ2NjllLTAxLCAvKiAweDNmMjJmOTgzICovCisJLyogUjAvUzAgb24gWzAsMl0gKi8KK3IwMCAgPSAtNi4yNTAwMDAwMDAwZS0wMiwgLyogMHhiZDgwMDAwMCAqLworcjAxICA9ICAxLjQwNzA1NjY5NzZlLTAzLCAvKiAweDNhYjg2Y2ZkICovCityMDIgID0gLTEuNTk5NTU2MzQ0NGUtMDUsIC8qIDB4Yjc4NjJlMzYgKi8KK3IwMyAgPSAgNC45NjcyNzk5MjA3ZS0wOCwgLyogMHgzMzU1NTdkMiAqLworczAxICA9ICAxLjkxNTM3NjA3NDZlLTAyLCAvKiAweDNjOWNlODU5ICovCitzMDIgID0gIDEuODU5NDY3ODg0MWUtMDQsIC8qIDB4Mzk0MmZhYjYgKi8KK3MwMyAgPSAgMS4xNzcxODQ2ODU3ZS0wNiwgLyogMHgzNTlkZmZjMiAqLworczA0ICA9ICA1LjA0NjM2MjQzOTBlLTA5LCAvKiAweDMxYWQ2NDQ2ICovCitzMDUgID0gIDEuMjM1NDIyNzAxNmUtMTE7IC8qIDB4MmQ1OTU2N2UgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gICAgPSAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfajFmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHIsdSx2LHk7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIG9uZS94OworCXkgPSBmYWJzZih4KTsKKwlpZihpeCA+PSAweDQwMDAwMDAwKSB7CS8qIHx4fCA+PSAyLjAgKi8KKwkJcyA9IHNpbmYoeSk7CisJCWMgPSBjb3NmKHkpOworCQlzcyA9IC1zLWM7CisJCWNjID0gcy1jOworCQlpZihpeDwweDdmMDAwMDAwKSB7ICAvKiBtYWtlIHN1cmUgeSt5IG5vdCBvdmVyZmxvdyAqLworCQkgICAgeiA9IGNvc2YoeSt5KTsKKwkJICAgIGlmICgocypjKT56ZXJvKSBjYyA9IHovc3M7CisJCSAgICBlbHNlIAkgICAgc3MgPSB6L2NjOworCQl9CisJLyoKKwkgKiBqMSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKmNjIC0gUSgxLHgpKnNzKSAvIHNxcnQoeCkKKwkgKiB5MSh4KSA9IDEvc3FydChwaSkgKiAoUCgxLHgpKnNzICsgUSgxLHgpKmNjKSAvIHNxcnQoeCkKKwkgKi8KKwkJaWYoaXg+MHg4MDAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqY2MpL3NxcnRmKHkpOworCQllbHNlIHsKKwkJICAgIHUgPSBwb25lZih5KTsgdiA9IHFvbmVmKHkpOworCQkgICAgeiA9IGludnNxcnRwaSoodSpjYy12KnNzKS9zcXJ0Zih5KTsKKwkJfQorCQlpZihoeDwwKSByZXR1cm4gLXo7CisJCWVsc2UgIAkgcmV0dXJuICB6OworCX0KKwlpZihpeDwweDMyMDAwMDAwKSB7CS8qIHx4fDwyKiotMjcgKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIChmbG9hdCkwLjUqeDsvKiBpbmV4YWN0IGlmIHghPTAgbmVjZXNzYXJ5ICovCisJfQorCXogPSB4Kng7CisJciA9ICB6KihyMDAreioocjAxK3oqKHIwMit6KnIwMykpKTsKKwlzID0gIG9uZSt6KihzMDEreiooczAyK3oqKHMwMyt6KihzMDQreipzMDUpKSkpOworCXIgKj0geDsKKwlyZXR1cm4oeCooZmxvYXQpMC41K3Ivcyk7Cit9CisKK3N0YXRpYyBjb25zdCBmbG9hdCBVMFs1XSA9IHsKKyAtMS45NjA1NzA5NjEyZS0wMSwgLyogMHhiZTQ4YzMzMSAqLworICA1LjA0NDM4NzI4MDllLTAyLCAvKiAweDNkNGU5ZTNjICovCisgLTEuOTEyNTY4OTI4N2UtMDMsIC8qIDB4YmFmYWFmMmEgKi8KKyAgMi4zNTI1MjU5MTY2ZS0wNSwgLyogMHgzN2M1NTgxYyAqLworIC05LjE5MDk5MTc4OTllLTA4LCAvKiAweGIzYzU2MDAzICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IFYwWzVdID0geworICAxLjk5MTY3MzE4NjRlLTAyLCAvKiAweDNjYTMyODZhICovCisgIDIuMDI1NTI1NzU1MGUtMDQsIC8qIDB4Mzk1NDY0NGIgKi8KKyAgMS4zNTYwODc5Nzc5ZS0wNiwgLyogMHgzNWI2MDJkNCAqLworICA2LjIyNzQxNDU4NDBlLTA5LCAvKiAweDMxZDVmOGViICovCisgIDEuNjY1NTkyNDkwM2UtMTEsIC8qIDB4MmQ5MjgxY2YgKi8KK307CisKK2Zsb2F0CitfX2llZWU3NTRfeTFmKGZsb2F0IHgpCit7CisJZmxvYXQgeiwgcyxjLHNzLGNjLHUsdjsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisgICAgICAgIGl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBpZiBZMShOYU4pIGlzIE5hTiwgWTEoLWluZikgaXMgTmFOLCBZMShpbmYpIGlzIDAgKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuICBvbmUvKHgreCp4KTsKKyAgICAgICAgaWYoaXg9PTApIHJldHVybiAtb25lL3plcm87CisgICAgICAgIGlmKGh4PDApIHJldHVybiB6ZXJvL3plcm87CisgICAgICAgIGlmKGl4ID49IDB4NDAwMDAwMDApIHsgIC8qIHx4fCA+PSAyLjAgKi8KKyAgICAgICAgICAgICAgICBzID0gc2luZih4KTsKKyAgICAgICAgICAgICAgICBjID0gY29zZih4KTsKKyAgICAgICAgICAgICAgICBzcyA9IC1zLWM7CisgICAgICAgICAgICAgICAgY2MgPSBzLWM7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg3ZjAwMDAwMCkgeyAgLyogbWFrZSBzdXJlIHgreCBub3Qgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeiA9IGNvc2YoeCt4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzKmMpPnplcm8pIGNjID0gei9zczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIHNzID0gei9jYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qIHkxKHgpID0gc3FydCgyLyhwaSp4KSkqKHAxKHgpKnNpbih4MCkrcTEoeCkqY29zKHgwKSkKKyAgICAgICAgICogd2hlcmUgeDAgPSB4LTNwaS80CisgICAgICAgICAqICAgICAgQmV0dGVyIGZvcm11bGE6CisgICAgICAgICAqICAgICAgICAgICAgICBjb3MoeDApID0gY29zKHgpY29zKDNwaS80KStzaW4oeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gIDEvc3FydCgyKSAqIChzaW4oeCkgLSBjb3MoeCkpCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeDApID0gc2luKHgpY29zKDNwaS80KS1jb3MoeClzaW4oM3BpLzQpCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gLTEvc3FydCgyKSAqIChjb3MoeCkgKyBzaW4oeCkpCisgICAgICAgICAqIFRvIGF2b2lkIGNhbmNlbGxhdGlvbiwgdXNlCisgICAgICAgICAqICAgICAgICAgICAgICBzaW4oeCkgKy0gY29zKHgpID0gLWNvcygyeCkvKHNpbih4KSAtKyBjb3MoeCkpCisgICAgICAgICAqIHRvIGNvbXB1dGUgdGhlIHdvcnNlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoaXg+MHg0ODAwMDAwMCkgeiA9IChpbnZzcXJ0cGkqc3MpL3NxcnRmKHgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1ID0gcG9uZWYoeCk7IHYgPSBxb25lZih4KTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IGludnNxcnRwaSoodSpzcyt2KmNjKS9zcXJ0Zih4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKyAgICAgICAgaWYoaXg8PTB4MjQ4MDAwMDApIHsgICAgLyogeCA8IDIqKi01NCAqLworICAgICAgICAgICAgcmV0dXJuKC10cGkveCk7CisgICAgICAgIH0KKyAgICAgICAgeiA9IHgqeDsKKyAgICAgICAgdSA9IFUwWzBdK3oqKFUwWzFdK3oqKFUwWzJdK3oqKFUwWzNdK3oqVTBbNF0pKSk7CisgICAgICAgIHYgPSBvbmUreiooVjBbMF0reiooVjBbMV0reiooVjBbMl0reiooVjBbM10reipWMFs0XSkpKSk7CisgICAgICAgIHJldHVybih4Kih1L3YpICsgdHBpKihfX2llZWU3NTRfajFmKHgpKl9faWVlZTc1NF9sb2dmKHgpLW9uZS94KSk7Cit9CisKKy8qIEZvciB4ID49IDgsIHRoZSBhc3ltcHRvdGljIGV4cGFuc2lvbnMgb2YgcG9uZSBpcworICoJMSArIDE1LzEyOCBzXjIgLSA0NzI1LzJeMTUgc140IC0gLi4uLAl3aGVyZSBzID0gMS94LgorICogV2UgYXBwcm94aW1hdGUgcG9uZSBieQorICogCXBvbmUoeCkgPSAxICsgKFIvUykKKyAqIHdoZXJlICBSID0gcHIwICsgcHIxKnNeMiArIHByMipzXjQgKyAuLi4gKyBwcjUqc14xMAorICogCSAgUyA9IDEgKyBwczAqc14yICsgLi4uICsgcHM0KnNeMTAKKyAqIGFuZAorICoJfCBwb25lKHgpLTEtUi9TIHwgPD0gMiAgKiogKCAtNjAuMDYpCisgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHByOFs2XSA9IHsgLyogZm9yIHggaW4gW2luZiwgOF09MS9bMCwwLjEyNV0gKi8KKyAgMC4wMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCAqLworICAxLjE3MTg3NTAwMDBlLTAxLCAvKiAweDNkZjAwMDAwICovCisgIDEuMzIzOTQ4MDk3MmUrMDEsIC8qIDB4NDE1M2Q0ZWEgKi8KKyAgNC4xMjA1MTg0OTM3ZSswMiwgLyogMHg0M2NlMDZhMyAqLworICAzLjg3NDc0NTM2MTNlKzAzLCAvKiAweDQ1NzIyYmVkICovCisgIDcuOTE0NDc5NDkyMmUrMDMsIC8qIDB4NDVmNzUzZDYgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHM4WzVdID0geworICAxLjE0MjA3MzY2OTRlKzAyLCAvKiAweDQyZTQ2YTJjICovCisgIDMuNjUwOTMwOTA4MmUrMDMsIC8qIDB4NDU2NDJlZTUgKi8KKyAgMy42OTU2MjA3MDMxZSswNCwgLyogMHg0NzEwNWMzNSAqLworICA5Ljc2MDI3OTY4NzVlKzA0LCAvKiAweDQ3YmVhMTY2ICovCisgIDMuMDgwNDI3MTQ4NGUrMDQsIC8qIDB4NDZmMGE4OGIgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAgMS4zMTk5MDUyMDk0ZS0xMSwgLyogMHgyZDY4MzMzZiAqLworICAxLjE3MTg3NDkyNTVlLTAxLCAvKiAweDNkZWZmZmZmICovCisgIDYuODAyNzUxMDY0M2UrMDAsIC8qIDB4NDBkOWIwMjMgKi8KKyAgMS4wODMwODE4MTc2ZSswMiwgLyogMHg0MmQ4OWRjYSAqLworICA1LjE3NjM2MTY5NDNlKzAyLCAvKiAweDQ0MDE2OGI3ICovCisgIDUuMjg3MTUyMDk5NmUrMDIsIC8qIDB4NDQwNDJkYzYgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHM1WzVdID0geworICA1LjkyODA1OTc2ODdlKzAxLCAvKiAweDQyNmQxZjU1ICovCisgIDkuOTE0MDE0MjgyMmUrMDIsIC8qIDB4NDQ3N2Q5YjEgKi8KKyAgNS4zNTMyNjcwODk4ZSswMywgLyogMHg0NWE3NGEyMyAqLworICA3Ljg0NDY5MDQyOTdlKzAzLCAvKiAweDQ1ZjUyNTg2ICovCisgIDEuNTA0MDQ2ODc1MGUrMDMsIC8qIDB4NDRiYzAxODAgKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBwcjNbNl0gPSB7CisgIDMuMDI1MDM5MTA4MWUtMDksIC8qIDB4MzE0ZmUxMGQgKi8KKyAgMS4xNzE4Njg2NjcwZS0wMSwgLyogMHgzZGVmZmZhYiAqLworICAzLjkzMjk3NzQzODBlKzAwLCAvKiAweDQwN2JiNWU3ICovCisgIDMuNTExOTQwMzgzOWUrMDEsIC8qIDB4NDIwYzdhNDUgKi8KKyAgOS4xMDU1MDA3OTM1ZSswMSwgLyogMHg0MmI2MWMyYSAqLworICA0Ljg1NTkwNjY3NzJlKzAxLCAvKiAweDQyNDIzYzdjICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHBzM1s1XSA9IHsKKyAgMy40NzkxMzA5MzU3ZSswMSwgLyogMHg0MjBiMmE0ZCAqLworICAzLjM2NzYyNDUxMTdlKzAyLCAvKiAweDQzYTg2MTk4ICovCisgIDEuMDQ2ODcxNDYwMGUrMDMsIC8qIDB4NDQ4MmRiZTMgKi8KKyAgOC45MDgxMTM0MDMzZSswMiwgLyogMHg0NDVlYjNlZCAqLworICAxLjAzNzg3OTMzMzVlKzAyLCAvKiAweDQyY2Y5MzZjICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgcHIyWzZdID0gey8qIGZvciB4IGluIFsyLjg1NzAsMl09MS9bMC4zNDk5LDAuNV0gKi8KKyAgMS4wNzcxMDgzMjI1ZS0wNywgLyogMHgzM2U3NGVhOCAqLworICAxLjE3MTc2MjE5ODJlLTAxLCAvKiAweDNkZWZmYTE2ICovCisgIDIuMzY4NTE1MDE0NmUrMDAsIC8qIDB4NDAxNzk1YzAgKi8KKyAgMS4yMjQyNjEwOTMxZSswMSwgLyogMHg0MTQzZTFiYyAqLworICAxLjc2OTM5NzE2MzRlKzAxLCAvKiAweDQxOGQ4ZDQxICovCisgIDUuMDczNTIzMDQ0NmUrMDAsIC8qIDB4NDBhMjVhNGQgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcHMyWzVdID0geworICAyLjE0MzY0ODUyOTFlKzAxLCAvKiAweDQxYWI3ZGVjICovCisgIDEuMjUyOTAyMjk4MGUrMDIsIC8qIDB4NDJmYTk0OTkgKi8KKyAgMi4zMjI3NjQ3NDAwZSswMiwgLyogMHg0MzY4NDZjNyAqLworICAxLjE3Njc5Mzc0NjllKzAyLCAvKiAweDQyZWI1YmQ3ICovCisgIDguMzY0NjM5MjgyMmUrMDAsIC8qIDB4NDEwNWQ1OTAgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcG9uZWYoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCB6LHIsczsKKyAgICAgICAgaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworICAgICAgICBpZihpeD49MHg0MTAwMDAwMCkgICAgIHtwID0gcHI4OyBxPSBwczg7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwZjcxYzU4KXtwID0gcHI1OyBxPSBwczU7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcHIzOyBxPSBwczM7fQorICAgICAgICBlbHNlIGlmKGl4Pj0weDQwMDAwMDAwKXtwID0gcHIyOyBxPSBwczI7fQorICAgICAgICB6ID0gb25lLyh4KngpOworICAgICAgICByID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisgICAgICAgIHMgPSBvbmUreioocVswXSt6KihxWzFdK3oqKHFbMl0reioocVszXSt6KnFbNF0pKSkpOworICAgICAgICByZXR1cm4gb25lKyByL3M7Cit9CisKKworLyogRm9yIHggPj0gOCwgdGhlIGFzeW1wdG90aWMgZXhwYW5zaW9ucyBvZiBxb25lIGlzCisgKgkzLzggcyAtIDEwNS8xMDI0IHNeMyAtIC4uLiwgd2hlcmUgcyA9IDEveC4KKyAqIFdlIGFwcHJveGltYXRlIHBvbmUgYnkKKyAqIAlxb25lKHgpID0gcyooMC4zNzUgKyAoUi9TKSkKKyAqIHdoZXJlICBSID0gcXIxKnNeMiArIHFyMipzXjQgKyAuLi4gKyBxcjUqc14xMAorICogCSAgUyA9IDEgKyBxczEqc14yICsgLi4uICsgcXM2KnNeMTIKKyAqIGFuZAorICoJfCBxb25lKHgpL3MgLTAuMzc1LVIvUyB8IDw9IDIgICoqICggLTYxLjEzKQorICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjhbNl0gPSB7IC8qIGZvciB4IGluIFtpbmYsIDhdPTEvWzAsMC4xMjVdICovCisgIDAuMDAwMDAwMDAwMGUrMDAsIC8qIDB4MDAwMDAwMDAgKi8KKyAtMS4wMjUzOTA2MjUwZS0wMSwgLyogMHhiZGQyMDAwMCAqLworIC0xLjYyNzE3NTMzMTFlKzAxLCAvKiAweGMxODIyYzhkICovCisgLTcuNTk2MDE3NDU2MWUrMDIsIC8qIDB4YzQzZGU2ODMgKi8KKyAtMS4xODQ5ODA2NjQxZSswNCwgLyogMHhjNjM5MjczYSAqLworIC00Ljg0Mzg1MTE3MTllKzA0LCAvKiAweGM3M2QzNjgzICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzOFs2XSA9IHsKKyAgMS42MTM5NTM3MDQ4ZSswMiwgLyogMHg0MzIxNjUzNyAqLworICA3LjgyNTM4NjIzMDVlKzAzLCAvKiAweDQ1ZjQ4YjE3ICovCisgIDEuMzM4NzUzNDM3NWUrMDUsIC8qIDB4NDgwMmJjZDYgKi8KKyAgNy4xOTY1Nzc1MDAwZSswNSwgLyogMHg0OTJmYjI5YyAqLworICA2LjY2NjAxMjUwMDBlKzA1LCAvKiAweDQ5MjJiZTk0ICovCisgLTIuOTQ0OTAyNTAwMGUrMDUsIC8qIDB4Yzg4ZmNiNDggKi8KK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBxcjVbNl0gPSB7IC8qIGZvciB4IGluIFs4LDQuNTQ1NF09MS9bMC4xMjUsMC4yMjAwMV0gKi8KKyAtMi4wODk3OTkzNDA1ZS0xMSwgLyogMHhhZGI3ZDIxOSAqLworIC0xLjAyNTM5MDQ3NjBlLTAxLCAvKiAweGJkZDFmZmZlICovCisgLTguMDU2NDQ3OTgyOGUrMDAsIC8qIDB4YzEwMGU3MzYgKi8KKyAtMS44MzY2OTYwMTQ0ZSswMiwgLyogMHhjMzM3YWI2YiAqLworIC0xLjM3MzE5MzcyNTZlKzAzLCAvKiAweGM0YWJhNjMzICovCisgLTIuNjEyNDQ0MzM1OWUrMDMsIC8qIDB4YzUyMzQ3MWMgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcXM1WzZdID0geworICA4LjEyNzY1NTAyOTNlKzAxLCAvKiAweDQyYTI4ZDk4ICovCisgIDEuOTkxNzk4NzA2MWUrMDMsIC8qIDB4NDRmOGY5OGYgKi8KKyAgMS43NDY4NDg0Mzc1ZSswNCwgLyogMHg0Njg4NzhmOCAqLworICA0Ljk4NTE0MjU3ODFlKzA0LCAvKiAweDQ3NDJiYjZkICovCisgIDIuNzk0ODA3NDIxOWUrMDQsIC8qIDB4NDZkYTU4MjYgKi8KKyAtNC43MTkxODM1OTM4ZSswMywgLyogMHhjNTkzNzk3OCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFyM1s2XSA9IHsKKyAtNS4wNzgzMTI0MzcyZS0wOSwgLyogMHhiMWFlN2Q0ZiAqLworIC0xLjAyNTM3ODMzMTVlLTAxLCAvKiAweGJkZDFmZjViICovCisgLTQuNjEwMTE2MDA0OWUrMDAsIC8qIDB4YzA5Mzg2MTIgKi8KKyAtNS43ODQ3MjIxMzc1ZSswMSwgLyogMHhjMjY3NjM4ZSAqLworIC0yLjI4MjQ0NTM3MzVlKzAyLCAvKiAweGMzNjQzZTlhICovCisgLTIuMTkyMTAxMjg3OGUrMDIsIC8qIDB4YzM1YjM1Y2IgKi8KK307CitzdGF0aWMgY29uc3QgZmxvYXQgcXMzWzZdID0geworICA0Ljc2NjUxNTM1MDNlKzAxLCAvKiAweDQyM2VhOTFlICovCisgIDYuNzM4NjUxMTIzMGUrMDIsIC8qIDB4NDQyODc3NWUgKi8KKyAgMy4zODAxNTI4MzIwZSswMywgLyogMHg0NTUzNDI3MiAqLworICA1LjU0NzcyOTAwMzllKzAzLCAvKiAweDQ1YWQ1ZGQ1ICovCisgIDEuOTAzMTE5MTQwNmUrMDMsIC8qIDB4NDRlZGUzZDAgKi8KKyAtMS4zNTIwMTE4NzEzZSswMiwgLyogMHhjMzA3MzM4MSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHFyMls2XSA9IHsvKiBmb3IgeCBpbiBbMi44NTcwLDJdPTEvWzAuMzQ5OSwwLjVdICovCisgLTEuNzgzODE3MjUzOWUtMDcsIC8qIDB4YjQzZjg5MzIgKi8KKyAtMS4wMjUxNzA0NjAzZS0wMSwgLyogMHhiZGQxZjQ3NSAqLworIC0yLjc1MjIwNTYxMDNlKzAwLCAvKiAweGMwMzAyNDIzICovCisgLTEuOTY2MzYxNjE4MGUrMDEsIC8qIDB4YzE5ZDRmMTYgKi8KKyAtNC4yMzI1MzEzNTY4ZSswMSwgLyogMHhjMjI5NGQxZiAqLworIC0yLjEzNzE5MjE1MzllKzAxLCAvKiAweGMxYWFmOWIyICovCit9Oworc3RhdGljIGNvbnN0IGZsb2F0IHFzMls2XSA9IHsKKyAgMi45NTMzMzYzMzQyZSswMSwgLyogMHg0MWVjNDQ1NCAqLworICAyLjUyOTgxNTUyMTJlKzAyLCAvKiAweDQzN2NmYjQ3ICovCisgIDcuNTc1MDI4MDc2MmUrMDIsIC8qIDB4NDQzZDYwMmUgKi8KKyAgNy4zOTM5MzE4ODQ4ZSswMiwgLyogMHg0NDM4ZDkyYSAqLworICAxLjU1OTQ5MDA1MTNlKzAyLCAvKiAweDQzMWJmMmYyICovCisgLTQuOTU5NDk4ODgyM2UrMDAsIC8qIDB4YzA5ZWI0MzcgKi8KK307CisKKwlzdGF0aWMgZmxvYXQgcW9uZWYoZmxvYXQgeCkKK3sKKwljb25zdCBmbG9hdCAqcCwqcTsKKwlmbG9hdCAgcyxyLHo7CisJaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4Pj0weDQwMjAwMDAwKSAgICAge3AgPSBxcjg7IHE9IHFzODt9CisJZWxzZSBpZihpeD49MHg0MGY3MWM1OCl7cCA9IHFyNTsgcT0gcXM1O30KKwllbHNlIGlmKGl4Pj0weDQwMzZkYjY4KXtwID0gcXIzOyBxPSBxczM7fQorCWVsc2UgaWYoaXg+PTB4NDAwMDAwMDApe3AgPSBxcjI7IHE9IHFzMjt9CisJeiA9IG9uZS8oeCp4KTsKKwlyID0gcFswXSt6KihwWzFdK3oqKHBbMl0reioocFszXSt6KihwWzRdK3oqcFs1XSkpKSk7CisJcyA9IG9uZSt6KihxWzBdK3oqKHFbMV0reioocVsyXSt6KihxWzNdK3oqKHFbNF0reipxWzVdKSkpKSk7CisJcmV0dXJuICgoZmxvYXQpLjM3NSArIHIvcykveDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfam4uYyBiL2xpYm0vc3JjL2Vfam4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNiMjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9qbi5jCkBAIC0wLDAgKzEsMjY2IEBACisKKy8qIEAoIyllX2puLmMgMS40IDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfam4uYyx2IDEuOSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9faWVlZTc1NF9qbihuLCB4KSwgX19pZWVlNzU0X3luKG4sIHgpCisgKiBmbG9hdGluZyBwb2ludCBCZXNzZWwncyBmdW5jdGlvbiBvZiB0aGUgMXN0IGFuZCAybmQga2luZAorICogb2Ygb3JkZXIgbgorICogICAgICAgICAgCisgKiBTcGVjaWFsIGNhc2VzOgorICoJeTAoMCk9eTEoMCk9eW4obiwwKSA9IC1pbmYgd2l0aCBkaXZpc2lvbiBieSB6ZXJvIHNpZ25hbDsKKyAqCXkwKC12ZSk9eTEoLXZlKT15bihuLC12ZSkgYXJlIE5hTiB3aXRoIGludmFsaWQgc2lnbmFsLgorICogTm90ZSAyLiBBYm91dCBqbihuLHgpLCB5bihuLHgpCisgKglGb3Igbj0wLCBqMCh4KSBpcyBjYWxsZWQsCisgKglmb3Igbj0xLCBqMSh4KSBpcyBjYWxsZWQsCisgKglmb3Igbjx4LCBmb3J3YXJkIHJlY3Vyc2lvbiB1cyB1c2VkIHN0YXJ0aW5nCisgKglmcm9tIHZhbHVlcyBvZiBqMCh4KSBhbmQgajEoeCkuCisgKglmb3Igbj54LCBhIGNvbnRpbnVlZCBmcmFjdGlvbiBhcHByb3hpbWF0aW9uIHRvCisgKglqKG4seCkvaihuLTEseCkgaXMgZXZhbHVhdGVkIGFuZCB0aGVuIGJhY2t3YXJkCisgKglyZWN1cnNpb24gaXMgdXNlZCBzdGFydGluZyBmcm9tIGEgc3VwcG9zZWQgdmFsdWUKKyAqCWZvciBqKG4seCkuIFRoZSByZXN1bHRpbmcgdmFsdWUgb2YgaigwLHgpIGlzCisgKgljb21wYXJlZCB3aXRoIHRoZSBhY3R1YWwgdmFsdWUgdG8gY29ycmVjdCB0aGUKKyAqCXN1cHBvc2VkIHZhbHVlIG9mIGoobix4KS4KKyAqCisgKgl5bihuLHgpIGlzIHNpbWlsYXIgaW4gYWxsIHJlc3BlY3RzLCBleGNlcHQKKyAqCXRoYXQgZm9yd2FyZCByZWN1cnNpb24gaXMgdXNlZCBmb3IgYWxsCisgKgl2YWx1ZXMgb2Ygbj4xLgorICoJCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQoraW52c3FydHBpPSAgNS42NDE4OTU4MzU0Nzc1NjI3OTI4MGUtMDEsIC8qIDB4M0ZFMjBERDcsIDB4NTA0MjlCNkQgKi8KK3R3byAgID0gIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwLCAweDAwMDAwMDAwICovCitvbmUgICA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMDsgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworCitzdGF0aWMgY29uc3QgZG91YmxlIHplcm8gID0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwOworCitkb3VibGUKK19faWVlZTc1NF9qbihpbnQgbiwgZG91YmxlIHgpCit7CisJaW50MzJfdCBpLGh4LGl4LGx4LCBzZ247CisJZG91YmxlIGEsIGIsIHRlbXAsIGRpOworCWRvdWJsZSB6LCB3OworCisgICAgLyogSigtbix4KSA9ICgtMSlebiAqIEoobiwgeCksIEoobiwgLXgpID0gKC0xKV5uICogSihuLCB4KQorICAgICAqIFRodXMsIEooLW4seCkgPSBKKG4sLXgpCisgICAgICovCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgSihuLE5hTikgaXMgTmFOICovCisJaWYoKGl4fCgodV9pbnQzMl90KShseHwtbHgpKT4+MzEpPjB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJaWYobjwwKXsJCQorCQluID0gLW47CisJCXggPSAteDsKKwkJaHggXj0gMHg4MDAwMDAwMDsKKwl9CisJaWYobj09MCkgcmV0dXJuKF9faWVlZTc1NF9qMCh4KSk7CisJaWYobj09MSkgcmV0dXJuKF9faWVlZTc1NF9qMSh4KSk7CisJc2duID0gKG4mMSkmKGh4Pj4zMSk7CS8qIGV2ZW4gbiAtLSAwLCBvZGQgbiAtLSBzaWduKHgpICovCisJeCA9IGZhYnMoeCk7CisJaWYoKGl4fGx4KT09MHx8aXg+PTB4N2ZmMDAwMDApIAkvKiBpZiB4IGlzIDAgb3IgaW5mICovCisJICAgIGIgPSB6ZXJvOworCWVsc2UgaWYoKGRvdWJsZSluPD14KSB7ICAgCisJCS8qIFNhZmUgdG8gdXNlIEoobisxLHgpPTJuL3ggKkoobix4KS1KKG4tMSx4KSAqLworCSAgICBpZihpeD49MHg1MkQwMDAwMCkgeyAvKiB4ID4gMioqMzAyICovCisgICAgLyogKHggPj4gbioqMikgCisgICAgICoJICAgIEpuKHgpID0gY29zKHgtKDJuKzEpKnBpLzQpKnNxcnQoMi94KnBpKQorICAgICAqCSAgICBZbih4KSA9IHNpbih4LSgybisxKSpwaS80KSpzcXJ0KDIveCpwaSkKKyAgICAgKgkgICAgTGV0IHM9c2luKHgpLCBjPWNvcyh4KSwgCisgICAgICoJCXhuPXgtKDJuKzEpKnBpLzQsIHNxdDIgPSBzcXJ0KDIpLHRoZW4KKyAgICAgKgorICAgICAqCQkgICBuCXNpbih4bikqc3F0Mgljb3MoeG4pKnNxdDIKKyAgICAgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqCQkgICAwCSBzLWMJCSBjK3MKKyAgICAgKgkJICAgMQktcy1jIAkJLWMrcworICAgICAqCQkgICAyCS1zK2MJCS1jLXMKKyAgICAgKgkJICAgMwkgcytjCQkgYy1zCisgICAgICovCisJCXN3aXRjaChuJjMpIHsKKwkJICAgIGNhc2UgMDogdGVtcCA9ICBjb3MoeCkrc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMTogdGVtcCA9IC1jb3MoeCkrc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMjogdGVtcCA9IC1jb3MoeCktc2luKHgpOyBicmVhazsKKwkJICAgIGNhc2UgMzogdGVtcCA9ICBjb3MoeCktc2luKHgpOyBicmVhazsKKwkJfQorCQliID0gaW52c3FydHBpKnRlbXAvc3FydCh4KTsKKwkgICAgfSBlbHNlIHsJCisJICAgICAgICBhID0gX19pZWVlNzU0X2owKHgpOworCSAgICAgICAgYiA9IF9faWVlZTc1NF9qMSh4KTsKKwkgICAgICAgIGZvcihpPTE7aTxuO2krKyl7CisJCSAgICB0ZW1wID0gYjsKKwkJICAgIGIgPSBiKigoZG91YmxlKShpK2kpL3gpIC0gYTsgLyogYXZvaWQgdW5kZXJmbG93ICovCisJCSAgICBhID0gdGVtcDsKKwkgICAgICAgIH0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGl4PDB4M2UxMDAwMDApIHsJLyogeCA8IDIqKi0yOSAqLworICAgIC8qIHggaXMgdGlueSwgcmV0dXJuIHRoZSBmaXJzdCBUYXlsb3IgZXhwYW5zaW9uIG9mIEoobix4KSAKKyAgICAgKiBKKG4seCkgPSAxL24hKih4LzIpXm4gIC0gLi4uCisgICAgICovCisJCWlmKG4+MzMpCS8qIHVuZGVyZmxvdyAqLworCQkgICAgYiA9IHplcm87CisJCWVsc2UgeworCQkgICAgdGVtcCA9IHgqMC41OyBiID0gdGVtcDsKKwkJICAgIGZvciAoYT1vbmUsaT0yO2k8PW47aSsrKSB7CisJCQlhICo9IChkb3VibGUpaTsJCS8qIGEgPSBuISAqLworCQkJYiAqPSB0ZW1wOwkJLyogYiA9ICh4LzIpXm4gKi8KKwkJICAgIH0KKwkJICAgIGIgPSBiL2E7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJLyogdXNlIGJhY2t3YXJkIHJlY3VycmVuY2UgKi8KKwkJLyogCQkJeCAgICAgIHheMiAgICAgIHheMiAgICAgICAKKwkJICogIEoobix4KS9KKG4tMSx4KSA9ICAtLS0tICAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgLSAyKG4rMSkgLSAyKG4rMikKKwkJICoKKwkJICogCQkJMSAgICAgIDEgICAgICAgIDEgICAgICAgCisJCSAqICAoZm9yIGxhcmdlIHgpICAgPSAgLS0tLSAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgIDIobisxKSAgIDIobisyKQorCQkgKgkJCS0tIC0gLS0tLS0tIC0gLS0tLS0tIC0gCisJCSAqCQkJIHggICAgIHggICAgICAgICB4CisJCSAqCisJCSAqIExldCB3ID0gMm4veCBhbmQgaD0yL3gsIHRoZW4gdGhlIGFib3ZlIHF1b3RpZW50CisJCSAqIGlzIGVxdWFsIHRvIHRoZSBjb250aW51ZWQgZnJhY3Rpb246CisJCSAqCQkgICAgMQorCQkgKgk9IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqCQkgICAgICAgMQorCQkgKgkgICB3IC0gLS0tLS0tLS0tLS0tLS0tLS0KKwkJICoJCQkgIDEKKwkJICogCSAgICAgICAgdytoIC0gLS0tLS0tLS0tCisJCSAqCQkgICAgICAgdysyaCAtIC4uLgorCQkgKgorCQkgKiBUbyBkZXRlcm1pbmUgaG93IG1hbnkgdGVybXMgbmVlZGVkLCBsZXQKKwkJICogUSgwKSA9IHcsIFEoMSkgPSB3KHcraCkgLSAxLAorCQkgKiBRKGspID0gKHcraypoKSpRKGstMSkgLSBRKGstMiksCisJCSAqIFdoZW4gUShrKSA+IDFlNAlnb29kIGZvciBzaW5nbGUgCisJCSAqIFdoZW4gUShrKSA+IDFlOQlnb29kIGZvciBkb3VibGUgCisJCSAqIFdoZW4gUShrKSA+IDFlMTcJZ29vZCBmb3IgcXVhZHJ1cGxlIAorCQkgKi8KKwkgICAgLyogZGV0ZXJtaW5lIGsgKi8KKwkJZG91YmxlIHQsdjsKKwkJZG91YmxlIHEwLHExLGgsdG1wOyBpbnQzMl90IGssbTsKKwkJdyAgPSAobituKS8oZG91YmxlKXg7IGggPSAyLjAvKGRvdWJsZSl4OworCQlxMCA9IHc7ICB6ID0gdytoOyBxMSA9IHcqeiAtIDEuMDsgaz0xOworCQl3aGlsZShxMTwxLjBlOSkgeworCQkJayArPSAxOyB6ICs9IGg7CisJCQl0bXAgPSB6KnExIC0gcTA7CisJCQlxMCA9IHExOworCQkJcTEgPSB0bXA7CisJCX0KKwkJbSA9IG4rbjsKKwkJZm9yKHQ9emVybywgaSA9IDIqKG4rayk7IGk+PW07IGkgLT0gMikgdCA9IG9uZS8oaS94LXQpOworCQlhID0gdDsKKwkJYiA9IG9uZTsKKwkJLyogIGVzdGltYXRlIGxvZygoMi94KV5uKm4hKSA9IG4qbG9nKDIveCkrbipsbihuKQorCQkgKiAgSGVuY2UsIGlmIG4qKGxvZygybi94KSkgPiAuLi4KKwkJICogIHNpbmdsZSA4Ljg3MjI4MzkzNTVlKzAxCisJCSAqICBkb3VibGUgNy4wOTc4MjcxMjg5MzM4Mzk3MzA5NmUrMDIKKwkJICogIGxvbmcgZG91YmxlIDEuMTM1NjUyMzQwNjI5NDE0Mzk0OTQ5MTkzMTA3Nzk3MDc2NTAwNjE3MGUrMDQKKwkJICogIHRoZW4gcmVjdXJyZW50IHZhbHVlIG1heSBvdmVyZmxvdyBhbmQgdGhlIHJlc3VsdCBpcworCQkgKiAgbGlrZWx5IHVuZGVyZmxvdyB0byB6ZXJvCisJCSAqLworCQl0bXAgPSBuOworCQl2ID0gdHdvL3g7CisJCXRtcCA9IHRtcCpfX2llZWU3NTRfbG9nKGZhYnModip0bXApKTsKKwkJaWYodG1wPDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyKSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShkb3VibGUpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCSAgICAgCSAgICB9CisJCX0gZWxzZSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShkb3VibGUpKGkraSk7aT4wO2ktLSl7CisJCSAgICAgICAgdGVtcCA9IGI7CisJCQliICo9IGRpOworCQkJYiAgPSBiL3ggLSBhOworCQkgICAgICAgIGEgPSB0ZW1wOworCQkJZGkgLT0gdHdvOworCQkgICAgLyogc2NhbGUgYiB0byBhdm9pZCBzcHVyaW91cyBvdmVyZmxvdyAqLworCQkJaWYoYj4xZTEwMCkgeworCQkJICAgIGEgLz0gYjsKKwkJCSAgICB0IC89IGI7CisJCQkgICAgYiAgPSBvbmU7CisJCQl9CisJICAgICAJICAgIH0KKwkJfQorCSAgICAJYiA9ICh0Kl9faWVlZTc1NF9qMCh4KS9iKTsKKwkgICAgfQorCX0KKwlpZihzZ249PTEpIHJldHVybiAtYjsgZWxzZSByZXR1cm4gYjsKK30KKworZG91YmxlCitfX2llZWU3NTRfeW4oaW50IG4sIGRvdWJsZSB4KQoreworCWludDMyX3QgaSxoeCxpeCxseDsKKwlpbnQzMl90IHNpZ247CisJZG91YmxlIGEsIGIsIHRlbXA7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKyAgICAvKiBpZiBZKG4sTmFOKSBpcyBOYU4gKi8KKwlpZigoaXh8KCh1X2ludDMyX3QpKGx4fC1seCkpPj4zMSk+MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlpZigoaXh8bHgpPT0wKSByZXR1cm4gLW9uZS96ZXJvOworCWlmKGh4PDApIHJldHVybiB6ZXJvL3plcm87CisJc2lnbiA9IDE7CisJaWYobjwwKXsKKwkJbiA9IC1uOworCQlzaWduID0gMSAtICgobiYxKTw8MSk7CisJfQorCWlmKG49PTApIHJldHVybihfX2llZWU3NTRfeTAoeCkpOworCWlmKG49PTEpIHJldHVybihzaWduKl9faWVlZTc1NF95MSh4KSk7CisJaWYoaXg9PTB4N2ZmMDAwMDApIHJldHVybiB6ZXJvOworCWlmKGl4Pj0weDUyRDAwMDAwKSB7IC8qIHggPiAyKiozMDIgKi8KKyAgICAvKiAoeCA+PiBuKioyKSAKKyAgICAgKgkgICAgSm4oeCkgPSBjb3MoeC0oMm4rMSkqcGkvNCkqc3FydCgyL3gqcGkpCisgICAgICoJICAgIFluKHgpID0gc2luKHgtKDJuKzEpKnBpLzQpKnNxcnQoMi94KnBpKQorICAgICAqCSAgICBMZXQgcz1zaW4oeCksIGM9Y29zKHgpLCAKKyAgICAgKgkJeG49eC0oMm4rMSkqcGkvNCwgc3F0MiA9IHNxcnQoMiksdGhlbgorICAgICAqCisgICAgICoJCSAgIG4Jc2luKHhuKSpzcXQyCWNvcyh4bikqc3F0MgorICAgICAqCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICoJCSAgIDAJIHMtYwkJIGMrcworICAgICAqCQkgICAxCS1zLWMgCQktYytzCisgICAgICoJCSAgIDIJLXMrYwkJLWMtcworICAgICAqCQkgICAzCSBzK2MJCSBjLXMKKyAgICAgKi8KKwkJc3dpdGNoKG4mMykgeworCQkgICAgY2FzZSAwOiB0ZW1wID0gIHNpbih4KS1jb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAxOiB0ZW1wID0gLXNpbih4KS1jb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAyOiB0ZW1wID0gLXNpbih4KStjb3MoeCk7IGJyZWFrOworCQkgICAgY2FzZSAzOiB0ZW1wID0gIHNpbih4KStjb3MoeCk7IGJyZWFrOworCQl9CisJCWIgPSBpbnZzcXJ0cGkqdGVtcC9zcXJ0KHgpOworCX0gZWxzZSB7CisJICAgIHVfaW50MzJfdCBoaWdoOworCSAgICBhID0gX19pZWVlNzU0X3kwKHgpOworCSAgICBiID0gX19pZWVlNzU0X3kxKHgpOworCS8qIHF1aXQgaWYgYiBpcyAtaW5mICovCisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCxiKTsKKwkgICAgZm9yKGk9MTtpPG4mJmhpZ2ghPTB4ZmZmMDAwMDA7aSsrKXsKKwkJdGVtcCA9IGI7CisJCWIgPSAoKGRvdWJsZSkoaStpKS94KSpiIC0gYTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLGIpOworCQlhID0gdGVtcDsKKwkgICAgfQorCX0KKwlpZihzaWduPjApIHJldHVybiBiOyBlbHNlIHJldHVybiAtYjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfam5mLmMgYi9saWJtL3NyYy9lX2puZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2puZi5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBlX2puZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9qbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9qbmYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitpbnZzcXJ0cGk9ICA1LjY0MTg5NjEyODdlLTAxLCAvKiAweDNmMTA2ZWJiICovCit0d28gICA9ICAyLjAwMDAwMDAwMDBlKzAwLCAvKiAweDQwMDAwMDAwICovCitvbmUgICA9ICAxLjAwMDAwMDAwMDBlKzAwOyAvKiAweDNGODAwMDAwICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICA9ICAwLjAwMDAwMDAwMDBlKzAwOworCitmbG9hdAorX19pZWVlNzU0X2puZihpbnQgbiwgZmxvYXQgeCkKK3sKKwlpbnQzMl90IGksaHgsaXgsIHNnbjsKKwlmbG9hdCBhLCBiLCB0ZW1wLCBkaTsKKwlmbG9hdCB6LCB3OworCisgICAgLyogSigtbix4KSA9ICgtMSlebiAqIEoobiwgeCksIEoobiwgLXgpID0gKC0xKV5uICogSihuLCB4KQorICAgICAqIFRodXMsIEooLW4seCkgPSBKKG4sLXgpCisgICAgICovCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSAweDdmZmZmZmZmJmh4OworICAgIC8qIGlmIEoobixOYU4pIGlzIE5hTiAqLworCWlmKGl4PjB4N2Y4MDAwMDApIHJldHVybiB4K3g7CisJaWYobjwwKXsKKwkJbiA9IC1uOworCQl4ID0gLXg7CisJCWh4IF49IDB4ODAwMDAwMDA7CisJfQorCWlmKG49PTApIHJldHVybihfX2llZWU3NTRfajBmKHgpKTsKKwlpZihuPT0xKSByZXR1cm4oX19pZWVlNzU0X2oxZih4KSk7CisJc2duID0gKG4mMSkmKGh4Pj4zMSk7CS8qIGV2ZW4gbiAtLSAwLCBvZGQgbiAtLSBzaWduKHgpICovCisJeCA9IGZhYnNmKHgpOworCWlmKGl4PT0wfHxpeD49MHg3ZjgwMDAwMCkgCS8qIGlmIHggaXMgMCBvciBpbmYgKi8KKwkgICAgYiA9IHplcm87CisJZWxzZSBpZigoZmxvYXQpbjw9eCkgeworCQkvKiBTYWZlIHRvIHVzZSBKKG4rMSx4KT0ybi94ICpKKG4seCktSihuLTEseCkgKi8KKwkgICAgYSA9IF9faWVlZTc1NF9qMGYoeCk7CisJICAgIGIgPSBfX2llZWU3NTRfajFmKHgpOworCSAgICBmb3IoaT0xO2k8bjtpKyspeworCQl0ZW1wID0gYjsKKwkJYiA9IGIqKChmbG9hdCkoaStpKS94KSAtIGE7IC8qIGF2b2lkIHVuZGVyZmxvdyAqLworCQlhID0gdGVtcDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmKGl4PDB4MzA4MDAwMDApIHsJLyogeCA8IDIqKi0yOSAqLworICAgIC8qIHggaXMgdGlueSwgcmV0dXJuIHRoZSBmaXJzdCBUYXlsb3IgZXhwYW5zaW9uIG9mIEoobix4KQorICAgICAqIEoobix4KSA9IDEvbiEqKHgvMilebiAgLSAuLi4KKyAgICAgKi8KKwkJaWYobj4zMykJLyogdW5kZXJmbG93ICovCisJCSAgICBiID0gemVybzsKKwkJZWxzZSB7CisJCSAgICB0ZW1wID0geCooZmxvYXQpMC41OyBiID0gdGVtcDsKKwkJICAgIGZvciAoYT1vbmUsaT0yO2k8PW47aSsrKSB7CisJCQlhICo9IChmbG9hdClpOwkJLyogYSA9IG4hICovCisJCQliICo9IHRlbXA7CQkvKiBiID0gKHgvMilebiAqLworCQkgICAgfQorCQkgICAgYiA9IGIvYTsKKwkJfQorCSAgICB9IGVsc2UgeworCQkvKiB1c2UgYmFja3dhcmQgcmVjdXJyZW5jZSAqLworCQkvKiAJCQl4ICAgICAgeF4yICAgICAgeF4yCisJCSAqICBKKG4seCkvSihuLTEseCkgPSAgLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC4uLi4uCisJCSAqCQkJMm4gIC0gMihuKzEpIC0gMihuKzIpCisJCSAqCisJCSAqIAkJCTEgICAgICAxICAgICAgICAxCisJCSAqICAoZm9yIGxhcmdlIHgpICAgPSAgLS0tLSAgLS0tLS0tICAgLS0tLS0tICAgLi4uLi4KKwkJICoJCQkybiAgIDIobisxKSAgIDIobisyKQorCQkgKgkJCS0tIC0gLS0tLS0tIC0gLS0tLS0tIC0KKwkJICoJCQkgeCAgICAgeCAgICAgICAgIHgKKwkJICoKKwkJICogTGV0IHcgPSAybi94IGFuZCBoPTIveCwgdGhlbiB0aGUgYWJvdmUgcXVvdGllbnQKKwkJICogaXMgZXF1YWwgdG8gdGhlIGNvbnRpbnVlZCBmcmFjdGlvbjoKKwkJICoJCSAgICAxCisJCSAqCT0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICoJCSAgICAgICAxCisJCSAqCSAgIHcgLSAtLS0tLS0tLS0tLS0tLS0tLQorCQkgKgkJCSAgMQorCQkgKiAJICAgICAgICB3K2ggLSAtLS0tLS0tLS0KKwkJICoJCSAgICAgICB3KzJoIC0gLi4uCisJCSAqCisJCSAqIFRvIGRldGVybWluZSBob3cgbWFueSB0ZXJtcyBuZWVkZWQsIGxldAorCQkgKiBRKDApID0gdywgUSgxKSA9IHcodytoKSAtIDEsCisJCSAqIFEoaykgPSAodytrKmgpKlEoay0xKSAtIFEoay0yKSwKKwkJICogV2hlbiBRKGspID4gMWU0CWdvb2QgZm9yIHNpbmdsZQorCQkgKiBXaGVuIFEoaykgPiAxZTkJZ29vZCBmb3IgZG91YmxlCisJCSAqIFdoZW4gUShrKSA+IDFlMTcJZ29vZCBmb3IgcXVhZHJ1cGxlCisJCSAqLworCSAgICAvKiBkZXRlcm1pbmUgayAqLworCQlmbG9hdCB0LHY7CisJCWZsb2F0IHEwLHExLGgsdG1wOyBpbnQzMl90IGssbTsKKwkJdyAgPSAobituKS8oZmxvYXQpeDsgaCA9IChmbG9hdCkyLjAvKGZsb2F0KXg7CisJCXEwID0gdzsgIHogPSB3K2g7IHExID0gdyp6IC0gKGZsb2F0KTEuMDsgaz0xOworCQl3aGlsZShxMTwoZmxvYXQpMS4wZTkpIHsKKwkJCWsgKz0gMTsgeiArPSBoOworCQkJdG1wID0geipxMSAtIHEwOworCQkJcTAgPSBxMTsKKwkJCXExID0gdG1wOworCQl9CisJCW0gPSBuK247CisJCWZvcih0PXplcm8sIGkgPSAyKihuK2spOyBpPj1tOyBpIC09IDIpIHQgPSBvbmUvKGkveC10KTsKKwkJYSA9IHQ7CisJCWIgPSBvbmU7CisJCS8qICBlc3RpbWF0ZSBsb2coKDIveClebipuISkgPSBuKmxvZygyL3gpK24qbG4obikKKwkJICogIEhlbmNlLCBpZiBuKihsb2coMm4veCkpID4gLi4uCisJCSAqICBzaW5nbGUgOC44NzIyODM5MzU1ZSswMQorCQkgKiAgZG91YmxlIDcuMDk3ODI3MTI4OTMzODM5NzMwOTZlKzAyCisJCSAqICBsb25nIGRvdWJsZSAxLjEzNTY1MjM0MDYyOTQxNDM5NDk0OTE5MzEwNzc5NzA3NjUwMDYxNzBlKzA0CisJCSAqICB0aGVuIHJlY3VycmVudCB2YWx1ZSBtYXkgb3ZlcmZsb3cgYW5kIHRoZSByZXN1bHQgaXMKKwkJICogIGxpa2VseSB1bmRlcmZsb3cgdG8gemVybworCQkgKi8KKwkJdG1wID0gbjsKKwkJdiA9IHR3by94OworCQl0bXAgPSB0bXAqX19pZWVlNzU0X2xvZ2YoZmFic2Yodip0bXApKTsKKwkJaWYodG1wPChmbG9hdCk4Ljg3MjE2Nzk2ODhlKzAxKSB7CisJICAgIAkgICAgZm9yKGk9bi0xLGRpPShmbG9hdCkoaStpKTtpPjA7aS0tKXsKKwkJICAgICAgICB0ZW1wID0gYjsKKwkJCWIgKj0gZGk7CisJCQliICA9IGIveCAtIGE7CisJCSAgICAgICAgYSA9IHRlbXA7CisJCQlkaSAtPSB0d287CisJICAgICAJICAgIH0KKwkJfSBlbHNlIHsKKwkgICAgCSAgICBmb3IoaT1uLTEsZGk9KGZsb2F0KShpK2kpO2k+MDtpLS0peworCQkgICAgICAgIHRlbXAgPSBiOworCQkJYiAqPSBkaTsKKwkJCWIgID0gYi94IC0gYTsKKwkJICAgICAgICBhID0gdGVtcDsKKwkJCWRpIC09IHR3bzsKKwkJICAgIC8qIHNjYWxlIGIgdG8gYXZvaWQgc3B1cmlvdXMgb3ZlcmZsb3cgKi8KKwkJCWlmKGI+KGZsb2F0KTFlMTApIHsKKwkJCSAgICBhIC89IGI7CisJCQkgICAgdCAvPSBiOworCQkJICAgIGIgID0gb25lOworCQkJfQorCSAgICAgCSAgICB9CisJCX0KKwkgICAgCWIgPSAodCpfX2llZWU3NTRfajBmKHgpL2IpOworCSAgICB9CisJfQorCWlmKHNnbj09MSkgcmV0dXJuIC1iOyBlbHNlIHJldHVybiBiOworfQorCitmbG9hdAorX19pZWVlNzU0X3luZihpbnQgbiwgZmxvYXQgeCkKK3sKKwlpbnQzMl90IGksaHgsaXgsaWI7CisJaW50MzJfdCBzaWduOworCWZsb2F0IGEsIGIsIHRlbXA7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisgICAgLyogaWYgWShuLE5hTikgaXMgTmFOICovCisJaWYoaXg+MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihpeD09MCkgcmV0dXJuIC1vbmUvemVybzsKKwlpZihoeDwwKSByZXR1cm4gemVyby96ZXJvOworCXNpZ24gPSAxOworCWlmKG48MCl7CisJCW4gPSAtbjsKKwkJc2lnbiA9IDEgLSAoKG4mMSk8PDEpOworCX0KKwlpZihuPT0wKSByZXR1cm4oX19pZWVlNzU0X3kwZih4KSk7CisJaWYobj09MSkgcmV0dXJuKHNpZ24qX19pZWVlNzU0X3kxZih4KSk7CisJaWYoaXg9PTB4N2Y4MDAwMDApIHJldHVybiB6ZXJvOworCisJYSA9IF9faWVlZTc1NF95MGYoeCk7CisJYiA9IF9faWVlZTc1NF95MWYoeCk7CisJLyogcXVpdCBpZiBiIGlzIC1pbmYgKi8KKwlHRVRfRkxPQVRfV09SRChpYixiKTsKKwlmb3IoaT0xO2k8biYmaWIhPTB4ZmY4MDAwMDA7aSsrKXsKKwkgICAgdGVtcCA9IGI7CisJICAgIGIgPSAoKGZsb2F0KShpK2kpL3gpKmIgLSBhOworCSAgICBHRVRfRkxPQVRfV09SRChpYixiKTsKKwkgICAgYSA9IHRlbXA7CisJfQorCWlmKHNpZ24+MCkgcmV0dXJuIGI7IGVsc2UgcmV0dXJuIC1iOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZGV4cGYuYyBiL2xpYm0vc3JjL2VfbGRleHBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyOTdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbGRleHBmLmMKQEAgLTAsMCArMSwyMiBAQAorLyogZV9zY2FsYmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfc2NhbGIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitfX2llZWU3NTRfbGRleHBmKGZsb2F0IHgsIGludCBmbikKK3sKKyAgICByZXR1cm4gX19pZWVlNzU0X3NjYWxiZih4LGZuKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hLmMgYi9saWJtL3NyYy9lX2xnYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWQ0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xnYW1tYS5jCkBAIC0wLDAgKzEsMzQgQEAKKworLyogQCgjKWVfbGdhbW1hLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYS5jLHYgMS44IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbGdhbW1hKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2xnYW1tYV9yCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZXh0ZXJuIGludCBzaWduZ2FtOworCitkb3VibGUKK19faWVlZTc1NF9sZ2FtbWEoZG91YmxlIHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFfcih4LCZzaWduZ2FtKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbGdhbW1hX3IuYyBiL2xpYm0vc3JjL2VfbGdhbW1hX3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRiZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFfci5jCkBAIC0wLDAgKzEsMjk3IEBACisKKy8qIEAoIyllX2xnYW1tYV9yLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xnYW1tYV9yLmMsdiAxLjggMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sZ2FtbWFfcih4LCBzaWduZ2FtcCkKKyAqIFJlZW50cmFudCB2ZXJzaW9uIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIAorICogd2l0aCB1c2VyIHByb3ZpZGUgcG9pbnRlciBmb3IgdGhlIHNpZ24gb2YgR2FtbWEoeCkuIAorICoKKyAqIE1ldGhvZDoKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uIGZvciAwIDwgeCA8PSA4CisgKiAJU2luY2UgZ2FtbWEoMStzKT1zKmdhbW1hKHMpLCBmb3IgeCBpbiBbMCw4XSwgd2UgbWF5IAorICogCXJlZHVjZSB4IHRvIGEgbnVtYmVyIGluIFsxLjUsMi41XSBieQorICogCQlsZ2FtbWEoMStzKSA9IGxvZyhzKSArIGxnYW1tYShzKQorICoJZm9yIGV4YW1wbGUsCisgKgkJbGdhbW1hKDcuMykgPSBsb2coNi4zKSArIGxnYW1tYSg2LjMpCisgKgkJCSAgICA9IGxvZyg2LjMqNS4zKSArIGxnYW1tYSg1LjMpCisgKgkJCSAgICA9IGxvZyg2LjMqNS4zKjQuMyozLjMqMi4zKSArIGxnYW1tYSgyLjMpCisgKiAgIDIuIFBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBvZiBsZ2FtbWEgYXJvdW5kIGl0cworICoJbWluaW11biB5bWluPTEuNDYxNjMyMTQ0OTY4MzYyMjQ1IHRvIG1haW50YWluIG1vbm90b25pY2l0eS4KKyAqCU9uIFt5bWluLTAuMjMsIHltaW4rMC4yN10gKGkuZS4sIFsxLjIzMTY0LDEuNzMxNjNdKSwgdXNlCisgKgkJTGV0IHogPSB4LXltaW47CisgKgkJbGdhbW1hKHgpID0gLTEuMjE0ODYyOTA1MzU4NDk2MDc4MjE4ICsgel4yKnBvbHkoeikKKyAqCXdoZXJlCisgKgkJcG9seSh6KSBpcyBhIDE0IGRlZ3JlZSBwb2x5bm9taWFsLgorICogICAyLiBSYXRpb25hbCBhcHByb3hpbWF0aW9uIGluIHRoZSBwcmltYXJ5IGludGVydmFsIFsyLDNdCisgKglXZSB1c2UgdGhlIGZvbGxvd2luZyBhcHByb3hpbWF0aW9uOgorICoJCXMgPSB4LTIuMDsKKyAqCQlsZ2FtbWEoeCkgPSAwLjUqcyArIHMqUChzKS9RKHMpCisgKgl3aXRoIGFjY3VyYWN5CisgKgkJfFAvUSAtIChsZ2FtbWEoeCktMC41cyl8IDwgMioqLTYxLjcxCisgKglPdXIgYWxnb3JpdGhtcyBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBvYnNlcnZhdGlvbgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXRhKDIpLTEgICAgMiAgICB6ZXRhKDMpLTEgICAgMworICogbGdhbW1hKDIrcykgPSBzKigxLUV1bGVyKSArIC0tLS0tLS0tLSAqIHMgIC0gIC0tLS0tLS0tLSAqIHMgICsgLi4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgIDMKKyAqCisgKgl3aGVyZSBFdWxlciA9IDAuNTc3MS4uLiBpcyB0aGUgRXVsZXIgY29uc3RhbnQsIHdoaWNoIGlzIHZlcnkKKyAqCWNsb3NlIHRvIDAuNS4KKyAqCisgKiAgIDMuIEZvciB4Pj04LCB3ZSBoYXZlCisgKglsZ2FtbWEoeCl+KHgtMC41KWxvZyh4KS14KzAuNSpsb2coMnBpKSsxLygxMngpLTEvKDM2MHgqKjMpKy4uLi4KKyAqCShiZXR0ZXIgZm9ybXVsYToKKyAqCSAgIGxnYW1tYSh4KX4oeC0wLjUpKihsb2coeCktMSktLjUqKGxvZygycGkpLTEpICsgLi4uKQorICoJTGV0IHogPSAxL3gsIHRoZW4gd2UgYXBwcm94aW1hdGlvbgorICoJCWYoeikgPSBsZ2FtbWEoeCkgLSAoeC0wLjUpKGxvZyh4KS0xKQorICoJYnkKKyAqCSAgCQkJICAgIDMgICAgICAgNSAgICAgICAgICAgICAxMQorICoJCXcgPSB3MCArIHcxKnogKyB3Mip6ICArIHczKnogICsgLi4uICsgdzYqegorICoJd2hlcmUgCisgKgkJfHcgLSBmKHopfCA8IDIqKi01OC43NAorICoJCQorICogICA0LiBGb3IgbmVnYXRpdmUgeCwgc2luY2UgKEcgaXMgZ2FtbWEgZnVuY3Rpb24pCisgKgkJLXgqRygteCkqRyh4KSA9IHBpL3NpbihwaSp4KSwKKyAqIAl3ZSBoYXZlCisgKiAJCUcoeCkgPSBwaS8oc2luKHBpKngpKigteCkqRygteCkpCisgKglzaW5jZSBHKC14KSBpcyBwb3NpdGl2ZSwgc2lnbihHKHgpKSA9IHNpZ24oc2luKHBpKngpKSBmb3IgeDwwCisgKglIZW5jZSwgZm9yIHg8MCwgc2lnbmdhbSA9IHNpZ24oc2luKHBpKngpKSBhbmQgCisgKgkJbGdhbW1hKHgpID0gbG9nKHxHYW1tYSh4KXwpCisgKgkJCSAgPSBsb2cocGkvKHx4KnNpbihwaSp4KXwpKSAtIGxnYW1tYSgteCk7CisgKglOb3RlOiBvbmUgc2hvdWxkIGF2b2lkIGNvbXB1dGUgcGkqKC14KSBkaXJlY3RseSBpbiB0aGUgCisgKgkgICAgICBjb21wdXRhdGlvbiBvZiBzaW4ocGkqKC14KSkuCisgKgkJCisgKiAgIDUuIFNwZWNpYWwgQ2FzZXMKKyAqCQlsZ2FtbWEoMitzKSB+IHMqKDEtRXVsZXIpIGZvciB0aW55IHMKKyAqCQlsZ2FtbWEoMSk9bGdhbW1hKDIpPTAKKyAqCQlsZ2FtbWEoeCkgfiAtbG9nKHgpIGZvciB0aW55IHgKKyAqCQlsZ2FtbWEoMCkgPSBsZ2FtbWEoaW5mKSA9IGluZgorICoJIAlsZ2FtbWEoLWludGVnZXIpID0gKy1pbmYKKyAqCQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3R3bzUyPSAgNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4NDMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KK2hhbGY9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAweDAwMDAwMDAwICovCitwaSAgPSAgMy4xNDE1OTI2NTM1ODk3OTMxMTYwMGUrMDAsIC8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK2EwICA9ICA3LjcyMTU2NjQ5MDE1MzI4NjU1NDk0ZS0wMiwgLyogMHgzRkIzQzQ2NywgMHhFMzdEQjBDOCAqLworYTEgID0gIDMuMjI0NjcwMzM0MjQxMTM1OTE2MTFlLTAxLCAvKiAweDNGRDRBMzRDLCAweEM0QTYwRkFEICovCithMiAgPSAgNi43MzUyMzAxMDUzMTI5MjY4MTgyNGUtMDIsIC8qIDB4M0ZCMTNFMDAsIDB4MUE1NTYyQTcgKi8KK2EzICA9ICAyLjA1ODA4MDg0MzI1MTY3MzMyODA2ZS0wMiwgLyogMHgzRjk1MTMyMiwgMHhBQzkyNTQ3QiAqLworYTQgID0gIDcuMzg1NTUwODYwODE0MDI4ODM5NTdlLTAzLCAvKiAweDNGN0U0MDRGLCAweEI2OEZFRkU4ICovCithNSAgPSAgMi44OTA1MTM4MzY3MzQxNTYyOTA5MWUtMDMsIC8qIDB4M0Y2N0FERDgsIDB4Q0NCNzkyNkIgKi8KK2E2ICA9ICAxLjE5MjcwNzYzMTgzMzYyMDY3ODQ1ZS0wMywgLyogMHgzRjUzOEE5NCwgMHgxMTZGM0Y1RCAqLworYTcgID0gIDUuMTAwNjk3OTIxNTM1MTEzMzY2MDhlLTA0LCAvKiAweDNGNDBCNkM2LCAweDg5Qjk5QzAwICovCithOCAgPSAgMi4yMDg2Mjc5MDcxMzkwODM4NTU1N2UtMDQsIC8qIDB4M0YyQ0YyRUMsIDB4RUQxMEU1NEQgKi8KK2E5ICA9ICAxLjA4MDExNTY3MjQ3NTgzOTM5OTU0ZS0wNCwgLyogMHgzRjFDNTA4OCwgMHg5ODdERkIwNyAqLworYTEwID0gIDIuNTIxNDQ1NjU0NTEyNTczMjY5MzllLTA1LCAvKiAweDNFRkE3MDc0LCAweDQyOENGQTUyICovCithMTEgPSAgNC40ODY0MDk0OTYxODkxNTE2MDE1MGUtMDUsIC8qIDB4M0YwNzg1OEUsIDB4OTBBNDU4MzcgKi8KK3RjICA9ICAxLjQ2MTYzMjE0NDk2ODM2MjI0NTc2ZSswMCwgLyogMHgzRkY3NjJEOCwgMHg2MzU2QkUzRiAqLwordGYgID0gLTEuMjE0ODYyOTA1MzU4NDk2MTE0NjFlLTAxLCAvKiAweEJGQkYxOUI5LCAweEJDQzM4QTQyICovCisvKiB0dCA9IC0odGFpbCBvZiB0ZikgKi8KK3R0ICA9IC0zLjYzODY3Njk5NzAzOTUwNTM2NTQxZS0xOCwgLyogMHhCQzUwQzdDQSwgMHhBNDhBOTcxRiAqLwordDAgID0gIDQuODM4MzYxMjI3MjM4MTAwNDcwNDJlLTAxLCAvKiAweDNGREVGNzJCLCAweEM4RUUzOEEyICovCit0MSAgPSAtMS40NzU4NzcyMjk5NDU5MzkxMTc1MmUtMDEsIC8qIDB4QkZDMkU0MjcsIDB4OERDNkM1MDkgKi8KK3QyICA9ICA2LjQ2MjQ5NDAyMzkxMzMzODU0Nzc4ZS0wMiwgLyogMHgzRkIwOEI0MiwgMHg5NEQ1NDE5QiAqLwordDMgID0gLTMuMjc4ODU0MTA3NTk4NTk2NDk1NjVlLTAyLCAvKiAweEJGQTBDOUE4LCAweERGMzVCNzEzICovCit0NCAgPSAgMS43OTcwNjc1MDgxMTgyMDM4NzEyNmUtMDIsIC8qIDB4M0Y5MjY2RTcsIDB4OTcwQUY5RUMgKi8KK3Q1ICA9IC0xLjAzMTQyMjQxMjk4MzQxNDM3NDUwZS0wMiwgLyogMHhCRjg1MUY5RiwgMHhCQTkxRUM2QSAqLwordDYgID0gIDYuMTAwNTM4NzAyNDYyOTEzMzI2MzVlLTAzLCAvKiAweDNGNzhGQ0UwLCAweEUzNzBFMzQ0ICovCit0NyAgPSAtMy42ODQ1MjAxNjc4MTEzODI1Njc2MGUtMDMsIC8qIDB4QkY2RTJFRkYsIDB4QjNFOTE0RDcgKi8KK3Q4ICA9ICAyLjI1OTY0NzgwOTAwNjEyNDcyMjUwZS0wMywgLyogMHgzRjYyODJEMywgMHgyRTE1QzkxNSAqLwordDkgID0gLTEuNDAzNDY0Njk5ODkyMzI4NDM4MTNlLTAzLCAvKiAweEJGNTZGRThFLCAweEJGMkQxQUYxICovCit0MTAgPSAgOC44MTA4MTg4MjQzNzY1NDAxMTM4MmUtMDQsIC8qIDB4M0Y0Q0RGMEMsIDB4RUY2MUE4RTkgKi8KK3QxMSA9IC01LjM4NTk1MzA1MzU2NzQwNTQ2NzE1ZS0wNCwgLyogMHhCRjQxQTYxMCwgMHg5QzczRTBFQyAqLwordDEyID0gIDMuMTU2MzIwNzA5MDM2MjU5NTAzNjFlLTA0LCAvKiAweDNGMzRBRjZELCAweDZDMEVCQkY3ICovCit0MTMgPSAtMy4xMjc1NDE2ODM3NTEyMDg2MDUxOGUtMDQsIC8qIDB4QkYzNDdGMjQsIDB4RUNDMzhDMzggKi8KK3QxNCA9ICAzLjM1NTI5MTkyNjM1NTE5MDczNTQzZS0wNCwgLyogMHgzRjM1RkQzRSwgMHhFOEMyRDNGNCAqLwordTAgID0gLTcuNzIxNTY2NDkwMTUzMjg2NTU0OTRlLTAyLCAvKiAweEJGQjNDNDY3LCAweEUzN0RCMEM4ICovCit1MSAgPSAgNi4zMjgyNzA2NDAyNTA5MzM2NjUxN2UtMDEsIC8qIDB4M0ZFNDQwMUUsIDB4OEIwMDVERkYgKi8KK3UyICA9ICAxLjQ1NDkyMjUwMTM3MjM0NzY4NzM3ZSswMCwgLyogMHgzRkY3NDc1QywgMHhEMTE5QkQ2RiAqLwordTMgID0gIDkuNzc3MTc1Mjc5NjMzNzI3NDU2MDNlLTAxLCAvKiAweDNGRUY0OTc2LCAweDQ0RUE4NDUwICovCit1NCAgPSAgMi4yODk2MzcyODA2NDY5MjQ1MTA5MmUtMDEsIC8qIDB4M0ZDRDRFQUUsIDB4RjYwMTA5MjQgKi8KK3U1ICA9ICAxLjMzODEwOTE4NTM2Nzg3NjYwMzc3ZS0wMiwgLyogMHgzRjhCNjc4QiwgMHhCRjJCQUIwOSAqLwordjEgID0gIDIuNDU1OTc3OTM3MTMwNDExMzQ4MjJlKzAwLCAvKiAweDQwMDNBNUQ3LCAweEMyQkQ2MTlDICovCit2MiAgPSAgMi4xMjg0ODk3NjM3OTg5MzM5NTM2MWUrMDAsIC8qIDB4NDAwMTA3MjUsIDB4QTQyQjE4RjUgKi8KK3YzICA9ICA3LjY5Mjg1MTUwNDU2NjcyNzgzODI1ZS0wMSwgLyogMHgzRkU4OURGQiwgMHhFNDUwNTBBRiAqLwordjQgID0gIDEuMDQyMjI2NDU1OTMzNjkxMzQyNTRlLTAxLCAvKiAweDNGQkFBRTU1LCAweEQ2NTM3Qzg4ICovCit2NSAgPSAgMy4yMTcwOTI0MjI4MjQyMzkxMTgxMGUtMDMsIC8qIDB4M0Y2QTVBQkIsIDB4NTdEMENGNjEgKi8KK3MwICA9IC03LjcyMTU2NjQ5MDE1MzI4NjU1NDk0ZS0wMiwgLyogMHhCRkIzQzQ2NywgMHhFMzdEQjBDOCAqLworczEgID0gIDIuMTQ5ODI0MTU5NjA2MDg4NTI1MDFlLTAxLCAvKiAweDNGQ0I4NDhCLCAweDM2RTIwODc4ICovCitzMiAgPSAgMy4yNTc3ODc5NjQwODkzMDk4MTc4N2UtMDEsIC8qIDB4M0ZENEQ5OEYsIDB4NEYxMzlGNTkgKi8KK3MzICA9ICAxLjQ2MzUwNDcyNjUyNDY0NDUyODA1ZS0wMSwgLyogMHgzRkMyQkI5QywgMHhCRUU1RjJGNyAqLworczQgID0gIDIuNjY0MjI3MDMwMzM2Mzg2MDk1NjBlLTAyLCAvKiAweDNGOUI0ODFDLCAweDdFOTM5OTYxICovCitzNSAgPSAgMS44NDAyODQ1MTQwNzMzNzcxNTY1MmUtMDMsIC8qIDB4M0Y1RTI2QjYsIDB4NzM2OEYyMzkgKi8KK3M2ICA9ICAzLjE5NDc1MzI2NTg0MTAwODY3NjE3ZS0wNSwgLyogMHgzRjAwQkZFQywgMHhERDE3RTk0NSAqLworcjEgID0gIDEuMzkyMDA1MzM0Njc2MjEwNDU5NThlKzAwLCAvKiAweDNGRjY0NUE3LCAweDYyQzRBQjc0ICovCityMiAgPSAgNy4yMTkzNTU0NzU2NzEzODA2OTUyNWUtMDEsIC8qIDB4M0ZFNzFBMTgsIDB4OTNEM0RDREMgKi8KK3IzICA9ICAxLjcxOTMzODY1NjMyODAzMDc4OTkzZS0wMSwgLyogMHgzRkM2MDFFRCwgMHhDQ0ZCREYyNyAqLworcjQgID0gIDEuODY0NTkxOTE3MTU2NTI5MDEzNDRlLTAyLCAvKiAweDNGOTMxN0VBLCAweDc0MkVENDc1ICovCityNSAgPSAgNy43Nzk0MjQ5NjM4MTg5MzU5NjQzNGUtMDQsIC8qIDB4M0Y0OTdEREEsIDB4Q0E0MUE5NUIgKi8KK3I2ICA9ICA3LjMyNjY4NDMwNzQ0NjI1NjM2MTg5ZS0wNiwgLyogMHgzRURFQkFGNywgMHhBNUIzODE0MCAqLwordzAgID0gIDQuMTg5Mzg1MzMyMDQ2NzI3MjUwNTJlLTAxLCAvKiAweDNGREFDRkUzLCAweDkwQzk3RDY5ICovCit3MSAgPSAgOC4zMzMzMzMzMzMzMzMyOTY3ODg0OWUtMDIsIC8qIDB4M0ZCNTU1NTUsIDB4NTU1NTU1M0IgKi8KK3cyICA9IC0yLjc3Nzc3Nzc3NzI4Nzc1NTM2NDcwZS0wMywgLyogMHhCRjY2QzE2QywgMHgxNkIwMkU1QyAqLwordzMgID0gIDcuOTM2NTA1NTg2NDMwMTk1NTg1MDBlLTA0LCAvKiAweDNGNEEwMTlGLCAweDk4Q0YzOEI2ICovCit3NCAgPSAtNS45NTE4NzU1NzQ1MDMzOTk2MzEzNWUtMDQsIC8qIDB4QkY0MzgwQ0IsIDB4OEMwRkU3NDEgKi8KK3c1ICA9ICA4LjM2MzM5OTE4OTk2MjgyMTM5MTI2ZS0wNCwgLyogMHgzRjRCNjdCQSwgMHg0Q0RBRDVEMSAqLwordzYgID0gLTEuNjMwOTI5MzQwOTY1NzUyNzM5ODllLTAzOyAvKiAweEJGNUFCODlELCAweDBCOUU0M0U0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybz0gIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwOworCisJc3RhdGljIGRvdWJsZSBzaW5fcGkoZG91YmxlIHgpCit7CisJZG91YmxlIHksejsKKwlpbnQgbixpeDsKKworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworCWlmKGl4PDB4M2ZkMDAwMDApIHJldHVybiBfX2tlcm5lbF9zaW4ocGkqeCx6ZXJvLDApOworCXkgPSAteDsJCS8qIHggaXMgYXNzdW1lIG5lZ2F0aXZlICovCisKKyAgICAvKgorICAgICAqIGFyZ3VtZW50IHJlZHVjdGlvbiwgbWFrZSBzdXJlIGluZXhhY3QgZmxhZyBub3QgcmFpc2VkIGlmIGlucHV0CisgICAgICogaXMgYW4gaW50ZWdlcgorICAgICAqLworCXogPSBmbG9vcih5KTsKKwlpZih6IT15KSB7CQkJCS8qIGluZXhhY3QgYW55d2F5ICovCisJICAgIHkgICo9IDAuNTsKKwkgICAgeSAgID0gMi4wKih5IC0gZmxvb3IoeSkpOwkJLyogeSA9IHx4fCBtb2QgMi4wICovCisJICAgIG4gICA9IChpbnQpICh5KjQuMCk7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGl4Pj0weDQzNDAwMDAwKSB7CisgICAgICAgICAgICAgICAgeSA9IHplcm87IG4gPSAwOyAgICAgICAgICAgICAgICAgLyogeSBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoaXg8MHg0MzMwMDAwMCkgeiA9IHkrdHdvNTI7CS8qIGV4YWN0ICovCisJCUdFVF9MT1dfV09SRChuLHopOworCQluICY9IDE7CisgICAgICAgICAgICAgICAgeSAgPSBuOworICAgICAgICAgICAgICAgIG48PD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAobikgeworCSAgICBjYXNlIDA6ICAgeSA9ICBfX2tlcm5lbF9zaW4ocGkqeSx6ZXJvLDApOyBicmVhazsKKwkgICAgY2FzZSAxOiAgIAorCSAgICBjYXNlIDI6ICAgeSA9ICBfX2tlcm5lbF9jb3MocGkqKDAuNS15KSx6ZXJvKTsgYnJlYWs7CisJICAgIGNhc2UgMzogIAorCSAgICBjYXNlIDQ6ICAgeSA9ICBfX2tlcm5lbF9zaW4ocGkqKG9uZS15KSx6ZXJvLDApOyBicmVhazsKKwkgICAgY2FzZSA1OgorCSAgICBjYXNlIDY6ICAgeSA9IC1fX2tlcm5lbF9jb3MocGkqKHktMS41KSx6ZXJvKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6ICB5ID0gIF9fa2VybmVsX3NpbihwaSooeS0yLjApLHplcm8sMCk7IGJyZWFrOworCSAgICB9CisJcmV0dXJuIC15OworfQorCisKK2RvdWJsZQorX19pZWVlNzU0X2xnYW1tYV9yKGRvdWJsZSB4LCBpbnQgKnNpZ25nYW1wKQoreworCWRvdWJsZSB0LHkseixuYWRqLHAscDEscDIscDMscSxyLHc7CisJaW50IGksaHgsbHgsaXg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCisgICAgLyogcHVyZ2Ugb2ZmICstaW5mLCBOYU4sICstMCwgYW5kIG5lZ2F0aXZlIGFyZ3VtZW50cyAqLworCSpzaWduZ2FtcCA9IDE7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OworCWlmKChpeHxseCk9PTApIHJldHVybiBvbmUvemVybzsKKwlpZihpeDwweDNiOTAwMDAwKSB7CS8qIHx4fDwyKiotNzAsIHJldHVybiAtbG9nKHx4fCkgKi8KKwkgICAgaWYoaHg8MCkgeworCSAgICAgICAgKnNpZ25nYW1wID0gLTE7CisJICAgICAgICByZXR1cm4gLV9faWVlZTc1NF9sb2coLXgpOworCSAgICB9IGVsc2UgcmV0dXJuIC1fX2llZWU3NTRfbG9nKHgpOworCX0KKwlpZihoeDwwKSB7CisJICAgIGlmKGl4Pj0weDQzMzAwMDAwKSAJLyogfHh8Pj0yKio1MiwgbXVzdCBiZSAtaW50ZWdlciAqLworCQlyZXR1cm4gb25lL3plcm87CisJICAgIHQgPSBzaW5fcGkoeCk7CisJICAgIGlmKHQ9PXplcm8pIHJldHVybiBvbmUvemVybzsgLyogLWludGVnZXIgKi8KKwkgICAgbmFkaiA9IF9faWVlZTc1NF9sb2cocGkvZmFicyh0KngpKTsKKwkgICAgaWYodDx6ZXJvKSAqc2lnbmdhbXAgPSAtMTsKKwkgICAgeCA9IC14OworCX0KKworICAgIC8qIHB1cmdlIG9mZiAxIGFuZCAyICovCisJaWYoKCgoaXgtMHgzZmYwMDAwMCl8bHgpPT0wKXx8KCgoaXgtMHg0MDAwMDAwMCl8bHgpPT0wKSkgciA9IDA7CisgICAgLyogZm9yIHggPCAyLjAgKi8KKwllbHNlIGlmKGl4PDB4NDAwMDAwMDApIHsKKwkgICAgaWYoaXg8PTB4M2ZlY2NjY2MpIHsgCS8qIGxnYW1tYSh4KSA9IGxnYW1tYSh4KzEpLWxvZyh4KSAqLworCQlyID0gLV9faWVlZTc1NF9sb2coeCk7CisJCWlmKGl4Pj0weDNGRTc2OTQ0KSB7eSA9IG9uZS14OyBpPSAwO30KKwkJZWxzZSBpZihpeD49MHgzRkNEQTY2MSkge3k9IHgtKHRjLW9uZSk7IGk9MTt9CisJICAJZWxzZSB7eSA9IHg7IGk9Mjt9CisJICAgIH0gZWxzZSB7CisJICAJciA9IHplcm87CisJICAgICAgICBpZihpeD49MHgzRkZCQjRDMykge3k9Mi4wLXg7aT0wO30gLyogWzEuNzMxNiwyXSAqLworCSAgICAgICAgZWxzZSBpZihpeD49MHgzRkYzQjRDNCkge3k9eC10YztpPTE7fSAvKiBbMS4yMywxLjczXSAqLworCQllbHNlIHt5PXgtb25lO2k9Mjt9CisJICAgIH0KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgICBjYXNlIDA6CisJCXogPSB5Knk7CisJCXAxID0gYTAreiooYTIreiooYTQreiooYTYreiooYTgreiphMTApKSkpOworCQlwMiA9IHoqKGExK3oqKGEzK3oqKGE1K3oqKGE3K3oqKGE5K3oqYTExKSkpKSk7CisJCXAgID0geSpwMStwMjsKKwkJciAgKz0gKHAtMC41KnkpOyBicmVhazsKKwkgICAgICBjYXNlIDE6CisJCXogPSB5Knk7CisJCXcgPSB6Knk7CisJCXAxID0gdDArdyoodDMrdyoodDYrdyoodDkgK3cqdDEyKSkpOwkvKiBwYXJhbGxlbCBjb21wICovCisJCXAyID0gdDErdyoodDQrdyoodDcrdyoodDEwK3cqdDEzKSkpOworCQlwMyA9IHQyK3cqKHQ1K3cqKHQ4K3cqKHQxMSt3KnQxNCkpKTsKKwkJcCAgPSB6KnAxLSh0dC13KihwMit5KnAzKSk7CisJCXIgKz0gKHRmICsgcCk7IGJyZWFrOworCSAgICAgIGNhc2UgMjoJCisJCXAxID0geSoodTAreSoodTEreSoodTIreSoodTMreSoodTQreSp1NSkpKSkpOworCQlwMiA9IG9uZSt5Kih2MSt5Kih2Mit5Kih2Myt5Kih2NCt5KnY1KSkpKTsKKwkJciArPSAoLTAuNSp5ICsgcDEvcDIpOworCSAgICB9CisJfQorCWVsc2UgaWYoaXg8MHg0MDIwMDAwMCkgeyAJCQkvKiB4IDwgOC4wICovCisJICAgIGkgPSAoaW50KXg7CisJICAgIHQgPSB6ZXJvOworCSAgICB5ID0geC0oZG91YmxlKWk7CisJICAgIHAgPSB5KihzMCt5KihzMSt5KihzMit5KihzMyt5KihzNCt5KihzNSt5KnM2KSkpKSkpOworCSAgICBxID0gb25lK3kqKHIxK3kqKHIyK3kqKHIzK3kqKHI0K3kqKHI1K3kqcjYpKSkpKTsKKwkgICAgciA9IGhhbGYqeStwL3E7CisJICAgIHogPSBvbmU7CS8qIGxnYW1tYSgxK3MpID0gbG9nKHMpICsgbGdhbW1hKHMpICovCisJICAgIHN3aXRjaChpKSB7CisJICAgIGNhc2UgNzogeiAqPSAoeSs2LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDY6IHogKj0gKHkrNS4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA1OiB6ICo9ICh5KzQuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNDogeiAqPSAoeSszLjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDM6IHogKj0gKHkrMi4wKTsJLyogRkFMTFRIUlUgKi8KKwkJICAgIHIgKz0gX19pZWVlNzU0X2xvZyh6KTsgYnJlYWs7CisJICAgIH0KKyAgICAvKiA4LjAgPD0geCA8IDIqKjU4ICovCisJfSBlbHNlIGlmIChpeCA8IDB4NDM5MDAwMDApIHsKKwkgICAgdCA9IF9faWVlZTc1NF9sb2coeCk7CisJICAgIHogPSBvbmUveDsKKwkgICAgeSA9IHoqejsKKwkgICAgdyA9IHcwK3oqKHcxK3kqKHcyK3kqKHczK3kqKHc0K3kqKHc1K3kqdzYpKSkpKTsKKwkgICAgciA9ICh4LWhhbGYpKih0LW9uZSkrdzsKKwl9IGVsc2UgCisgICAgLyogMioqNTggPD0geCA8PSBpbmYgKi8KKwkgICAgciA9ICB4KihfX2llZWU3NTRfbG9nKHgpLW9uZSk7CisJaWYoaHg8MCkgciA9IG5hZGogLSByOworCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sZ2FtbWFmLmMgYi9saWJtL3NyYy9lX2xnYW1tYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY0OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFmLmMKQEAgLTAsMCArMSwzNSBAQAorLyogZV9sZ2FtbWFmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX2xnYW1tYS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sZ2FtbWFmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9sZ2FtbWFmKHgpCisgKiBSZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBNZXRob2Q6IGNhbGwgX19pZWVlNzU0X2xnYW1tYWZfcgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2V4dGVybiBpbnQgc2lnbmdhbTsKKworZmxvYXQKK19faWVlZTc1NF9sZ2FtbWFmKGZsb2F0IHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9sZ2FtbWFmX3IoeCwmc2lnbmdhbSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xnYW1tYWZfci5jIGIvbGlibS9zcmMvZV9sZ2FtbWFmX3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU1MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sZ2FtbWFmX3IuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogZV9sZ2FtbWFmX3IuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfbGdhbW1hX3IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbGdhbW1hZl9yLmMsdiAxLjkgMjAwNS8xMS8yOCAwODozMjoxNSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjM9ICA4LjM4ODYwODAwMDBlKzA2LCAvKiAweDRiMDAwMDAwICovCitoYWxmPSAgNS4wMDAwMDAwMDAwZS0wMSwgLyogMHgzZjAwMDAwMCAqLworb25lID0gIDEuMDAwMDAwMDAwMGUrMDAsIC8qIDB4M2Y4MDAwMDAgKi8KK3BpICA9ICAzLjE0MTU5Mjc0MTBlKzAwLCAvKiAweDQwNDkwZmRiICovCithMCAgPSAgNy43MjE1NjY0MDg5ZS0wMiwgLyogMHgzZDllMjMzZiAqLworYTEgID0gIDMuMjI0NjcwMjkwOWUtMDEsIC8qIDB4M2VhNTFhNjYgKi8KK2EyICA9ICA2LjczNTIzMDIzNzJlLTAyLCAvKiAweDNkODlmMDAxICovCithMyAgPSAgMi4wNTgwODA3NzAxZS0wMiwgLyogMHgzY2E4OTkxNSAqLworYTQgID0gIDcuMzg1NTUwOTk4MmUtMDMsIC8qIDB4M2JmMjAyN2UgKi8KK2E1ICA9ICAyLjg5MDUxMzc0NDJlLTAzLCAvKiAweDNiM2Q2ZWM2ICovCithNiAgPSAgMS4xOTI3MDc2ODQ4ZS0wMywgLyogMHgzYTljNTRhMSAqLworYTcgID0gIDUuMTAwNjk3NzQ0NmUtMDQsIC8qIDB4M2EwNWI2MzQgKi8KK2E4ICA9ICAyLjIwODYyNzg0NzdlLTA0LCAvKiAweDM5Njc5NzY3ICovCithOSAgPSAgMS4wODAxMTU2ODk1ZS0wNCwgLyogMHgzOGUyODQ0NSAqLworYTEwID0gIDIuNTIxNDQ1NjQwMGUtMDUsIC8qIDB4MzdkMzgzYTIgKi8KK2ExMSA9ICA0LjQ4NjQwOTY3MDhlLTA1LCAvKiAweDM4M2MyYzc1ICovCit0YyAgPSAgMS40NjE2MzIxMzI1ZSswMCwgLyogMHgzZmJiMTZjMyAqLwordGYgID0gLTEuMjE0ODYyODM4NGUtMDEsIC8qIDB4YmRmOGNkY2QgKi8KKy8qIHR0ID0gLSh0YWlsIG9mIHRmKSAqLwordHQgID0gIDYuNjk3MTAwNjUxOGUtMDksIC8qIDB4MzFlNjFjNTIgKi8KK3QwICA9ICA0LjgzODM2MTE0NDFlLTAxLCAvKiAweDNlZjdiOTVlICovCit0MSAgPSAtMS40NzU4NzcxNjU4ZS0wMSwgLyogMHhiZTE3MjEzYyAqLwordDIgID0gIDYuNDYyNDk0MjgzOWUtMDIsIC8qIDB4M2Q4NDVhMTUgKi8KK3QzICA9IC0zLjI3ODg1NDExNjhlLTAyLCAvKiAweGJkMDY0ZDQ3ICovCit0NCAgPSAgMS43OTcwNjc1NjAzZS0wMiwgLyogMHgzYzkzMzczZCAqLwordDUgID0gLTEuMDMxNDIyNDI4OGUtMDIsIC8qIDB4YmMyOGZjZmUgKi8KK3Q2ICA9ICA2LjEwMDUzODY1MjRlLTAzLCAvKiAweDNiYzdlNzA3ICovCit0NyAgPSAtMy42ODQ1MjAyNTU4ZS0wMywgLyogMHhiYjcxNzdmZSAqLwordDggID0gIDIuMjU5NjQ3NzA2NWUtMDMsIC8qIDB4M2IxNDE2OTkgKi8KK3Q5ICA9IC0xLjQwMzQ2NDcwMjllLTAzLCAvKiAweGJhYjdmNDc2ICovCit0MTAgPSAgOC44MTA4MTg1NDQ2ZS0wNCwgLyogMHgzYTY2Zjg2NyAqLwordDExID0gLTUuMzg1OTUzMTE4MWUtMDQsIC8qIDB4YmEwZDMwODUgKi8KK3QxMiA9ICAzLjE1NjMyMDU5OTRlLTA0LCAvKiAweDM5YTU3YjZiICovCit0MTMgPSAtMy4xMjc1NDE1Njc3ZS0wNCwgLyogMHhiOWEzZjkyNyAqLwordDE0ID0gIDMuMzU1MjkxODQ2N2UtMDQsIC8qIDB4MzlhZmU5ZjcgKi8KK3UwICA9IC03LjcyMTU2NjQwODllLTAyLCAvKiAweGJkOWUyMzNmICovCit1MSAgPSAgNi4zMjgyNzA0MzUzZS0wMSwgLyogMHgzZjIyMDBmNCAqLwordTIgID0gIDEuNDU0OTIyNTU2OWUrMDAsIC8qIDB4M2ZiYTNhZTcgKi8KK3UzICA9ICA5Ljc3NzE3NTE4ODFlLTAxLCAvKiAweDNmN2E0YmIyICovCit1NCAgPSAgMi4yODk2MzczMjcyZS0wMSwgLyogMHgzZTZhNzU3OCAqLwordTUgID0gIDEuMzM4MTA5MTg3OGUtMDIsIC8qIDB4M2M1YjNjNWUgKi8KK3YxICA9ICAyLjQ1NTk3NzkxNjdlKzAwLCAvKiAweDQwMWQyZWJlICovCit2MiAgPSAgMi4xMjg0ODk3MzI3ZSswMCwgLyogMHg0MDA4MzkyZCAqLwordjMgID0gIDcuNjkyODUxNDI0MmUtMDEsIC8qIDB4M2Y0NGVmZGYgKi8KK3Y0ICA9ICAxLjA0MjIyNjQ3ODVlLTAxLCAvKiAweDNkZDU3MmFmICovCit2NSAgPSAgMy4yMTcwOTI0ODI0ZS0wMywgLyogMHgzYjUyZDVkYiAqLworczAgID0gLTcuNzIxNTY2NDA4OWUtMDIsIC8qIDB4YmQ5ZTIzM2YgKi8KK3MxICA9ICAyLjE0OTgyNDIwMjFlLTAxLCAvKiAweDNlNWMyNDVhICovCitzMiAgPSAgMy4yNTc3ODc4MjM3ZS0wMSwgLyogMHgzZWE2Y2M3YSAqLworczMgID0gIDEuNDYzNTA0NzMxN2UtMDEsIC8qIDB4M2UxNWRjZTYgKi8KK3M0ICA9ICAyLjY2NDIyNzAzODZlLTAyLCAvKiAweDNjZGE0MGU0ICovCitzNSAgPSAgMS44NDAyODQ1NTk5ZS0wMywgLyogMHgzYWYxMzViNCAqLworczYgID0gIDMuMTk0NzUzMjk4OWUtMDUsIC8qIDB4MzgwNWZmNjcgKi8KK3IxICA9ICAxLjM5MjAwNTMyNDRlKzAwLCAvKiAweDNmYjIyZDNiICovCityMiAgPSAgNy4yMTkzNTU3MDI0ZS0wMSwgLyogMHgzZjM4ZDBjNSAqLworcjMgID0gIDEuNzE5MzM4NTk1OWUtMDEsIC8qIDB4M2UzMDBmNmUgKi8KK3I0ICA9ICAxLjg2NDU5MTk4NTllLTAyLCAvKiAweDNjOThiZjU0ICovCityNSAgPSAgNy43Nzk0MjQ3NzczZS0wNCwgLyogMHgzYTRiZWVkNiAqLworcjYgID0gIDcuMzI2Njg0MjI2NGUtMDYsIC8qIDB4MzZmNWQ3YmQgKi8KK3cwICA9ICA0LjE4OTM4NTQ3MzdlLTAxLCAvKiAweDNlZDY3ZjFkICovCit3MSAgPSAgOC4zMzMzMzM1ODE3ZS0wMiwgLyogMHgzZGFhYWFhYiAqLwordzIgID0gLTIuNzc3Nzc3ODQ1MGUtMDMsIC8qIDB4YmIzNjBiNjEgKi8KK3czICA9ICA3LjkzNjUwNTcxNzJlLTA0LCAvKiAweDNhNTAwY2ZkICovCit3NCAgPSAtNS45NTE4NzUzNTUxZS0wNCwgLyogMHhiYTFjMDY1YyAqLwordzUgID0gIDguMzYzMzk4OTU2MWUtMDQsIC8qIDB4M2E1YjNkZDIgKi8KK3c2ICA9IC0xLjYzMDkyOTI5ODdlLTAzOyAvKiAweGJhZDVjNGU4ICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvPSAgMC4wMDAwMDAwMDAwZSswMDsKKworCXN0YXRpYyBmbG9hdCBzaW5fcGlmKGZsb2F0IHgpCit7CisJZmxvYXQgeSx6OworCWludCBuLGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsKKworCWlmKGl4PDB4M2U4MDAwMDApIHJldHVybiBfX2tlcm5lbF9zaW5kZihwaSp4KTsKKwl5ID0gLXg7CQkvKiB4IGlzIGFzc3VtZSBuZWdhdGl2ZSAqLworCisgICAgLyoKKyAgICAgKiBhcmd1bWVudCByZWR1Y3Rpb24sIG1ha2Ugc3VyZSBpbmV4YWN0IGZsYWcgbm90IHJhaXNlZCBpZiBpbnB1dAorICAgICAqIGlzIGFuIGludGVnZXIKKyAgICAgKi8KKwl6ID0gZmxvb3JmKHkpOworCWlmKHohPXkpIHsJCQkJLyogaW5leGFjdCBhbnl3YXkgKi8KKwkgICAgeSAgKj0gKGZsb2F0KTAuNTsKKwkgICAgeSAgID0gKGZsb2F0KTIuMCooeSAtIGZsb29yZih5KSk7CS8qIHkgPSB8eHwgbW9kIDIuMCAqLworCSAgICBuICAgPSAoaW50KSAoeSooZmxvYXQpNC4wKTsKKwl9IGVsc2UgeworICAgICAgICAgICAgaWYoaXg+PTB4NGI4MDAwMDApIHsKKyAgICAgICAgICAgICAgICB5ID0gemVybzsgbiA9IDA7ICAgICAgICAgICAgICAgICAvKiB5IG11c3QgYmUgZXZlbiAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihpeDwweDRiMDAwMDAwKSB6ID0geSt0d28yMzsJLyogZXhhY3QgKi8KKwkJR0VUX0ZMT0FUX1dPUkQobix6KTsKKwkJbiAmPSAxOworICAgICAgICAgICAgICAgIHkgID0gbjsKKyAgICAgICAgICAgICAgICBuPDw9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKG4pIHsKKwkgICAgY2FzZSAwOiAgIHkgPSAgX19rZXJuZWxfc2luZGYocGkqeSk7IGJyZWFrOworCSAgICBjYXNlIDE6CisJICAgIGNhc2UgMjogICB5ID0gIF9fa2VybmVsX2Nvc2RmKHBpKigoZmxvYXQpMC41LXkpKTsgYnJlYWs7CisJICAgIGNhc2UgMzoKKwkgICAgY2FzZSA0OiAgIHkgPSAgX19rZXJuZWxfc2luZGYocGkqKG9uZS15KSk7IGJyZWFrOworCSAgICBjYXNlIDU6CisJICAgIGNhc2UgNjogICB5ID0gLV9fa2VybmVsX2Nvc2RmKHBpKih5LShmbG9hdCkxLjUpKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6ICB5ID0gIF9fa2VybmVsX3NpbmRmKHBpKih5LShmbG9hdCkyLjApKTsgYnJlYWs7CisJICAgIH0KKwlyZXR1cm4gLXk7Cit9CisKKworZmxvYXQKK19faWVlZTc1NF9sZ2FtbWFmX3IoZmxvYXQgeCwgaW50ICpzaWduZ2FtcCkKK3sKKwlmbG9hdCB0LHkseixuYWRqLHAscDEscDIscDMscSxyLHc7CisJaW50IGksaHgsaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKworICAgIC8qIHB1cmdlIG9mZiArLWluZiwgTmFOLCArLTAsIGFuZCBuZWdhdGl2ZSBhcmd1bWVudHMgKi8KKwkqc2lnbmdhbXAgPSAxOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgqeDsKKwlpZihpeD09MCkgcmV0dXJuIG9uZS96ZXJvOworCWlmKGl4PDB4MzUwMDAwMDApIHsJLyogfHh8PDIqKi0yMSwgcmV0dXJuIC1sb2cofHh8KSAqLworCSAgICBpZihoeDwwKSB7CisJICAgICAgICAqc2lnbmdhbXAgPSAtMTsKKwkgICAgICAgIHJldHVybiAtX19pZWVlNzU0X2xvZ2YoLXgpOworCSAgICB9IGVsc2UgcmV0dXJuIC1fX2llZWU3NTRfbG9nZih4KTsKKwl9CisJaWYoaHg8MCkgeworCSAgICBpZihpeD49MHg0YjAwMDAwMCkgCS8qIHx4fD49MioqMjMsIG11c3QgYmUgLWludGVnZXIgKi8KKwkJcmV0dXJuIG9uZS96ZXJvOworCSAgICB0ID0gc2luX3BpZih4KTsKKwkgICAgaWYodD09emVybykgcmV0dXJuIG9uZS96ZXJvOyAvKiAtaW50ZWdlciAqLworCSAgICBuYWRqID0gX19pZWVlNzU0X2xvZ2YocGkvZmFic2YodCp4KSk7CisJICAgIGlmKHQ8emVybykgKnNpZ25nYW1wID0gLTE7CisJICAgIHggPSAteDsKKwl9CisKKyAgICAvKiBwdXJnZSBvZmYgMSBhbmQgMiAqLworCWlmIChpeD09MHgzZjgwMDAwMHx8aXg9PTB4NDAwMDAwMDApIHIgPSAwOworICAgIC8qIGZvciB4IDwgMi4wICovCisJZWxzZSBpZihpeDwweDQwMDAwMDAwKSB7CisJICAgIGlmKGl4PD0weDNmNjY2NjY2KSB7IAkvKiBsZ2FtbWEoeCkgPSBsZ2FtbWEoeCsxKS1sb2coeCkgKi8KKwkJciA9IC1fX2llZWU3NTRfbG9nZih4KTsKKwkJaWYoaXg+PTB4M2YzYjRhMjApIHt5ID0gb25lLXg7IGk9IDA7fQorCQllbHNlIGlmKGl4Pj0weDNlNmQzMzA4KSB7eT0geC0odGMtb25lKTsgaT0xO30KKwkgIAllbHNlIHt5ID0geDsgaT0yO30KKwkgICAgfSBlbHNlIHsKKwkgIAlyID0gemVybzsKKwkgICAgICAgIGlmKGl4Pj0weDNmZGRhNjE4KSB7eT0oZmxvYXQpMi4wLXg7aT0wO30gLyogWzEuNzMxNiwyXSAqLworCSAgICAgICAgZWxzZSBpZihpeD49MHgzRjlkYTYyMCkge3k9eC10YztpPTE7fSAvKiBbMS4yMywxLjczXSAqLworCQllbHNlIHt5PXgtb25lO2k9Mjt9CisJICAgIH0KKwkgICAgc3dpdGNoKGkpIHsKKwkgICAgICBjYXNlIDA6CisJCXogPSB5Knk7CisJCXAxID0gYTAreiooYTIreiooYTQreiooYTYreiooYTgreiphMTApKSkpOworCQlwMiA9IHoqKGExK3oqKGEzK3oqKGE1K3oqKGE3K3oqKGE5K3oqYTExKSkpKSk7CisJCXAgID0geSpwMStwMjsKKwkJciAgKz0gKHAtKGZsb2F0KTAuNSp5KTsgYnJlYWs7CisJICAgICAgY2FzZSAxOgorCQl6ID0geSp5OworCQl3ID0geip5OworCQlwMSA9IHQwK3cqKHQzK3cqKHQ2K3cqKHQ5ICt3KnQxMikpKTsJLyogcGFyYWxsZWwgY29tcCAqLworCQlwMiA9IHQxK3cqKHQ0K3cqKHQ3K3cqKHQxMCt3KnQxMykpKTsKKwkJcDMgPSB0Mit3Kih0NSt3Kih0OCt3Kih0MTErdyp0MTQpKSk7CisJCXAgID0geipwMS0odHQtdyoocDIreSpwMykpOworCQlyICs9ICh0ZiArIHApOyBicmVhazsKKwkgICAgICBjYXNlIDI6CisJCXAxID0geSoodTAreSoodTEreSoodTIreSoodTMreSoodTQreSp1NSkpKSkpOworCQlwMiA9IG9uZSt5Kih2MSt5Kih2Mit5Kih2Myt5Kih2NCt5KnY1KSkpKTsKKwkJciArPSAoLShmbG9hdCkwLjUqeSArIHAxL3AyKTsKKwkgICAgfQorCX0KKwllbHNlIGlmKGl4PDB4NDEwMDAwMDApIHsgCQkJLyogeCA8IDguMCAqLworCSAgICBpID0gKGludCl4OworCSAgICB0ID0gemVybzsKKwkgICAgeSA9IHgtKGZsb2F0KWk7CisJICAgIHAgPSB5KihzMCt5KihzMSt5KihzMit5KihzMyt5KihzNCt5KihzNSt5KnM2KSkpKSkpOworCSAgICBxID0gb25lK3kqKHIxK3kqKHIyK3kqKHIzK3kqKHI0K3kqKHI1K3kqcjYpKSkpKTsKKwkgICAgciA9IGhhbGYqeStwL3E7CisJICAgIHogPSBvbmU7CS8qIGxnYW1tYSgxK3MpID0gbG9nKHMpICsgbGdhbW1hKHMpICovCisJICAgIHN3aXRjaChpKSB7CisJICAgIGNhc2UgNzogeiAqPSAoeSsoZmxvYXQpNi4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSA2OiB6ICo9ICh5KyhmbG9hdCk1LjApOwkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlIDU6IHogKj0gKHkrKGZsb2F0KTQuMCk7CS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgNDogeiAqPSAoeSsoZmxvYXQpMy4wKTsJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSAzOiB6ICo9ICh5KyhmbG9hdCkyLjApOwkvKiBGQUxMVEhSVSAqLworCQkgICAgciArPSBfX2llZWU3NTRfbG9nZih6KTsgYnJlYWs7CisJICAgIH0KKyAgICAvKiA4LjAgPD0geCA8IDIqKjU4ICovCisJfSBlbHNlIGlmIChpeCA8IDB4NWM4MDAwMDApIHsKKwkgICAgdCA9IF9faWVlZTc1NF9sb2dmKHgpOworCSAgICB6ID0gb25lL3g7CisJICAgIHkgPSB6Kno7CisJICAgIHcgPSB3MCt6Kih3MSt5Kih3Mit5Kih3Myt5Kih3NCt5Kih3NSt5Knc2KSkpKSk7CisJICAgIHIgPSAoeC1oYWxmKSoodC1vbmUpK3c7CisJfSBlbHNlCisgICAgLyogMioqNTggPD0geCA8PSBpbmYgKi8KKwkgICAgciA9ICB4KihfX2llZWU3NTRfbG9nZih4KS1vbmUpOworCWlmKGh4PDApIHIgPSBuYWRqIC0gcjsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nLmMgYi9saWJtL3NyYy9lX2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYmYwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZy5jCkBAIC0wLDAgKzEsMTM1IEBACisKKy8qIEAoIyllX2xvZy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZy5jLHYgMS4xMCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X2xvZyh4KQorICogUmV0dXJuIHRoZSBsb2dyaXRobSBvZiB4CisgKgorICogTWV0aG9kIDogICAgICAgICAgICAgICAgICAKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uOiBmaW5kIGsgYW5kIGYgc3VjaCB0aGF0IAorICoJCQl4ID0gMl5rICogKDErZiksIAorICoJICAgd2hlcmUgIHNxcnQoMikvMiA8IDErZiA8IHNxcnQoMikgLgorICoKKyAqICAgMi4gQXBwcm94aW1hdGlvbiBvZiBsb2coMStmKS4KKyAqCUxldCBzID0gZi8oMitmKSA7IGJhc2VkIG9uIGxvZygxK2YpID0gbG9nKDErcykgLSBsb2coMS1zKQorICoJCSA9IDJzICsgMi8zIHMqKjMgKyAyLzUgcyoqNSArIC4uLi4uLAorICoJICAgICAJID0gMnMgKyBzKlIKKyAqICAgICAgV2UgdXNlIGEgc3BlY2lhbCBSZW1lIGFsZ29yaXRobSBvbiBbMCwwLjE3MTZdIHRvIGdlbmVyYXRlIAorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTQgdG8gYXBwcm94aW1hdGUgUiBUaGUgbWF4aW11bSBlcnJvciAKKyAqCW9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQgYnkgMioqLTU4LjQ1LiBJbgorICoJb3RoZXIgd29yZHMsCisgKgkJICAgICAgICAyICAgICAgNCAgICAgIDYgICAgICA4ICAgICAgMTAgICAgICAxMiAgICAgIDE0CisgKgkgICAgUih6KSB+IExnMSpzICtMZzIqcyArTGczKnMgK0xnNCpzICtMZzUqcyAgK0xnNipzICArTGc3KnMKKyAqICAJKHRoZSB2YWx1ZXMgb2YgTGcxIHRvIExnNyBhcmUgbGlzdGVkIGluIHRoZSBwcm9ncmFtKQorICoJYW5kCisgKgkgICAgfCAgICAgIDIgICAgICAgICAgMTQgICAgICAgICAgfCAgICAgLTU4LjQ1CisgKgkgICAgfCBMZzEqcyArLi4uK0xnNypzICAgIC0gIFIoeikgfCA8PSAyIAorICoJICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCU5vdGUgdGhhdCAycyA9IGYgLSBzKmYgPSBmIC0gaGZzcSArIHMqaGZzcSwgd2hlcmUgaGZzcSA9IGYqZi8yLgorICoJSW4gb3JkZXIgdG8gZ3VhcmFudGVlIGVycm9yIGluIGxvZyBiZWxvdyAxdWxwLCB3ZSBjb21wdXRlIGxvZworICoJYnkKKyAqCQlsb2coMStmKSA9IGYgLSBzKihmIC0gUikJKGlmIGYgaXMgbm90IHRvbyBsYXJnZSkKKyAqCQlsb2coMStmKSA9IGYgLSAoaGZzcSAtIHMqKGhmc3ErUikpLgkoYmV0dGVyIGFjY3VyYWN5KQorICoJCisgKgkzLiBGaW5hbGx5LCAgbG9nKHgpID0gaypsbjIgKyBsb2coMStmKS4gIAorICoJCQkgICAgPSBrKmxuMl9oaSsoZi0oaGZzcS0ocyooaGZzcStSKStrKmxuMl9sbykpKQorICoJICAgSGVyZSBsbjIgaXMgc3BsaXQgaW50byB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAKKyAqCQkJbG4yX2hpICsgbG4yX2xvLAorICoJICAgd2hlcmUgbipsbjJfaGkgaXMgYWx3YXlzIGV4YWN0IGZvciB8bnwgPCAyMDAwLgorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglsb2coeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHggPCAwIChpbmNsdWRpbmcgLUlORikgOyAKKyAqCWxvZygrSU5GKSBpcyArSU5GOyBsb2coMCkgaXMgLUlORiB3aXRoIHNpZ25hbDsKKyAqCWxvZyhOYU4pIGlzIHRoYXQgTmFOIHdpdGggbm8gc2lnbmFsLgorICoKKyAqIEFjY3VyYWN5OgorICoJYWNjb3JkaW5nIHRvIGFuIGVycm9yIGFuYWx5c2lzLCB0aGUgZXJyb3IgaXMgYWx3YXlzIGxlc3MgdGhhbgorICoJMSB1bHAgKHVuaXQgaW4gdGhlIGxhc3QgcGxhY2UpLgorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorbG4yX2hpICA9ICA2LjkzMTQ3MTgwMzY5MTIzODE2NDkwZS0wMSwJLyogM2ZlNjJlNDIgZmVlMDAwMDAgKi8KK2xuMl9sbyAgPSAgMS45MDgyMTQ5MjkyNzA1ODc3MDAwMmUtMTAsCS8qIDNkZWEzOWVmIDM1NzkzYzc2ICovCit0d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAgLyogNDM1MDAwMDAgMDAwMDAwMDAgKi8KK0xnMSA9IDYuNjY2NjY2NjY2NjY2NzM1MTMwZS0wMSwgIC8qIDNGRTU1NTU1IDU1NTU1NTkzICovCitMZzIgPSAzLjk5OTk5OTk5OTk0MDk0MTkwOGUtMDEsICAvKiAzRkQ5OTk5OSA5OTk3RkEwNCAqLworTGczID0gMi44NTcxNDI4NzQzNjYyMzkxNDllLTAxLCAgLyogM0ZEMjQ5MjQgOTQyMjkzNTkgKi8KK0xnNCA9IDIuMjIyMjE5ODQzMjE0OTc4Mzk2ZS0wMSwgIC8qIDNGQ0M3MUM1IDFEOEU3OEFGICovCitMZzUgPSAxLjgxODM1NzIxNjE2MTgwNTAxMmUtMDEsICAvKiAzRkM3NDY2NCA5NkNCMDNERSAqLworTGc2ID0gMS41MzEzODM3Njk5MjA5MzczMzJlLTAxLCAgLyogM0ZDMzlBMDkgRDA3OEM2OUYgKi8KK0xnNyA9IDEuNDc5ODE5ODYwNTExNjU4NTkxZS0wMTsgIC8qIDNGQzJGMTEyIERGM0U1MjQ0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyAgID0gIDAuMDsKKworZG91YmxlCitfX2llZWU3NTRfbG9nKGRvdWJsZSB4KQoreworCWRvdWJsZSBoZnNxLGYscyx6LFIsdyx0MSx0MixkazsKKwlpbnQzMl90IGssaHgsaSxqOworCXVfaW50MzJfdCBseDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisKKwlrPTA7CisJaWYgKGh4IDwgMHgwMDEwMDAwMCkgewkJCS8qIHggPCAyKiotMTAyMiAgKi8KKwkgICAgaWYgKCgoaHgmMHg3ZmZmZmZmZil8bHgpPT0wKSAKKwkJcmV0dXJuIC10d281NC96ZXJvOwkJLyogbG9nKCstMCk9LWluZiAqLworCSAgICBpZiAoaHg8MCkgcmV0dXJuICh4LXgpL3plcm87CS8qIGxvZygtIykgPSBOYU4gKi8KKwkgICAgayAtPSA1NDsgeCAqPSB0d281NDsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworCX0gCisJaWYgKGh4ID49IDB4N2ZmMDAwMDApIHJldHVybiB4K3g7CisJayArPSAoaHg+PjIwKS0xMDIzOworCWh4ICY9IDB4MDAwZmZmZmY7CisJaSA9IChoeCsweDk1ZjY0KSYweDEwMDAwMDsKKwlTRVRfSElHSF9XT1JEKHgsaHh8KGleMHgzZmYwMDAwMCkpOwkvKiBub3JtYWxpemUgeCBvciB4LzIgKi8KKwlrICs9IChpPj4yMCk7CisJZiA9IHgtMS4wOworCWlmKCgweDAwMGZmZmZmJigyK2h4KSk8MykgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87ICBlbHNlIHtkaz0oZG91YmxlKWs7CisJCQkJIHJldHVybiBkaypsbjJfaGkrZGsqbG4yX2xvO30KKwkgICAgUiA9IGYqZiooMC41LTAuMzMzMzMzMzMzMzMzMzMzMzMqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2Uge2RrPShkb3VibGUpazsKKwkgICAgCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKFItZGsqbG4yX2xvKS1mKTt9CisJfQorIAlzID0gZi8oMi4wK2YpOyAKKwlkayA9IChkb3VibGUpazsKKwl6ID0gcypzOworCWkgPSBoeC0weDYxNDdhOworCXcgPSB6Kno7CisJaiA9IDB4NmI4NTEtaHg7CisJdDE9IHcqKExnMit3KihMZzQrdypMZzYpKTsgCisJdDI9IHoqKExnMSt3KihMZzMrdyooTGc1K3cqTGc3KSkpOyAKKwlpIHw9IGo7CisJUiA9IHQyK3QxOworCWlmKGk+MCkgeworCSAgICBoZnNxPTAuNSpmKmY7CisJICAgIGlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrZGsqbG4yX2xvKSktZik7CisJfSBlbHNlIHsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtcyooZi1SKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChzKihmLVIpLWRrKmxuMl9sbyktZik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9sb2cxMC5jIGIvbGlibS9zcmMvZV9sb2cxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGMwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX2xvZzEwLmMKQEAgLTAsMCArMSw4NyBAQAorCisvKiBAKCMpZV9sb2cxMC5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX2xvZzEwLmMsdiAxLjExIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfbG9nMTAoeCkKKyAqIFJldHVybiB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgeAorICogCisgKiBNZXRob2QgOgorICoJTGV0IGxvZzEwXzJoaSA9IGxlYWRpbmcgNDAgYml0cyBvZiBsb2cxMCgyKSBhbmQKKyAqCSAgICBsb2cxMF8ybG8gPSBsb2cxMCgyKSAtIGxvZzEwXzJoaSwKKyAqCSAgICBpdmxuMTAgICA9IDEvbG9nKDEwKSByb3VuZGVkLgorICoJVGhlbgorICoJCW4gPSBpbG9nYih4KSwgCisgKgkJaWYobjwwKSAgbiA9IG4rMTsKKyAqCQl4ID0gc2NhbGJuKHgsLW4pOworICoJCWxvZzEwKHgpIDo9IG4qbG9nMTBfMmhpICsgKG4qbG9nMTBfMmxvICsgaXZsbjEwKmxvZyh4KSkKKyAqCisgKiBOb3RlIDE6CisgKglUbyBndWFyYW50ZWUgbG9nMTAoMTAqKm4pPW4sIHdoZXJlIDEwKipuIGlzIG5vcm1hbCwgdGhlIHJvdW5kaW5nIAorICoJbW9kZSBtdXN0IHNldCB0byBSb3VuZC10by1OZWFyZXN0LgorICogTm90ZSAyOgorICoJWzEvbG9nKDEwKV0gcm91bmRlZCB0byA1MyBiaXRzIGhhcyBlcnJvciAgLjE5OCAgIHVscHM7CisgKglsb2cxMCBpcyBtb25vdG9uaWMgYXQgYWxsIGJpbmFyeSBicmVhayBwb2ludHMuCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCWxvZzEwKHgpIGlzIE5hTiB3aXRoIHNpZ25hbCBpZiB4IDwgMDsgCisgKglsb2cxMCgrSU5GKSBpcyArSU5GIHdpdGggbm8gc2lnbmFsOyBsb2cxMCgwKSBpcyAtSU5GIHdpdGggc2lnbmFsOworICoJbG9nMTAoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbDsKKyAqCWxvZzEwKDEwKipOKSA9IE4gIGZvciBOPTAsMSwuLi4sMjIuCisgKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLgorICogVGhlIGRlY2ltYWwgdmFsdWVzIG1heSBiZSB1c2VkLCBwcm92aWRlZCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQKKyAqIGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzCisgKiBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCAgICAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAvKiAweDQzNTAwMDAwLCAweDAwMDAwMDAwICovCitpdmxuMTAgICAgID0gIDQuMzQyOTQ0ODE5MDMyNTE4MTY2NjhlLTAxLCAvKiAweDNGREJDQjdCLCAweDE1MjZFNTBFICovCitsb2cxMF8yaGkgID0gIDMuMDEwMjk5OTU2NjM2MTE3NzEzMDZlLTAxLCAvKiAweDNGRDM0NDEzLCAweDUwOUY2MDAwICovCitsb2cxMF8ybG8gID0gIDMuNjk0MjM5MDc3MTU4OTMwNzg2MTZlLTEzOyAvKiAweDNENTlGRUYzLCAweDExRjEyQjM2ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyAgID0gIDAuMDsKKworZG91YmxlCitfX2llZWU3NTRfbG9nMTAoZG91YmxlIHgpCit7CisJZG91YmxlIHksejsKKwlpbnQzMl90IGksayxoeDsKKwl1X2ludDMyX3QgbHg7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCisgICAgICAgIGs9MDsKKyAgICAgICAgaWYgKGh4IDwgMHgwMDEwMDAwMCkgeyAgICAgICAgICAgICAgICAgIC8qIHggPCAyKiotMTAyMiAgKi8KKyAgICAgICAgICAgIGlmICgoKGh4JjB4N2ZmZmZmZmYpfGx4KT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLXR3bzU0L3plcm87ICAgICAgICAgICAgIC8qIGxvZygrLTApPS1pbmYgKi8KKyAgICAgICAgICAgIGlmIChoeDwwKSByZXR1cm4gKHgteCkvemVybzsgICAgICAgIC8qIGxvZygtIykgPSBOYU4gKi8KKyAgICAgICAgICAgIGsgLT0gNTQ7IHggKj0gdHdvNTQ7IC8qIHN1Ym5vcm1hbCBudW1iZXIsIHNjYWxlIHVwIHggKi8KKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKyAgICAgICAgfQorCWlmIChoeCA+PSAweDdmZjAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGh4Pj4yMCktMTAyMzsKKwlpICA9ICgodV9pbnQzMl90KWsmMHg4MDAwMDAwMCk+PjMxOworICAgICAgICBoeCA9IChoeCYweDAwMGZmZmZmKXwoKDB4M2ZmLWkpPDwyMCk7CisgICAgICAgIHkgID0gKGRvdWJsZSkoaytpKTsKKwlTRVRfSElHSF9XT1JEKHgsaHgpOworCXogID0geSpsb2cxMF8ybG8gKyBpdmxuMTAqX19pZWVlNzU0X2xvZyh4KTsKKwlyZXR1cm4gIHoreSpsb2cxMF8yaGk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX2xvZzEwZi5jIGIvbGlibS9zcmMvZV9sb2cxMGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDczMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9sb2cxMGYuYwpAQCAtMCwwICsxLDU1IEBACisvKiBlX2xvZzEwZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sb2cxMC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9sb2cxMGYuYyx2IDEuOCAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSAgICAgID0gIDMuMzU1NDQzMjAwMGUrMDcsIC8qIDB4NGMwMDAwMDAgKi8KK2l2bG4xMCAgICAgPSAgNC4zNDI5NDQ5MjAxZS0wMSwgLyogMHgzZWRlNWJkOSAqLworbG9nMTBfMmhpICA9ICAzLjAxMDI5MjA1MzJlLTAxLCAvKiAweDNlOWEyMDgwICovCitsb2cxMF8ybG8gID0gIDcuOTAzNDE1MTY2OGUtMDc7IC8qIDB4MzU1NDI3ZGIgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gICA9ICAwLjA7CisKK2Zsb2F0CitfX2llZWU3NTRfbG9nMTBmKGZsb2F0IHgpCit7CisJZmxvYXQgeSx6OworCWludDMyX3QgaSxrLGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisKKyAgICAgICAgaz0wOworICAgICAgICBpZiAoaHggPCAweDAwODAwMDAwKSB7ICAgICAgICAgICAgICAgICAgLyogeCA8IDIqKi0xMjYgICovCisgICAgICAgICAgICBpZiAoKGh4JjB4N2ZmZmZmZmYpPT0wKQorICAgICAgICAgICAgICAgIHJldHVybiAtdHdvMjUvemVybzsgICAgICAgICAgICAgLyogbG9nKCstMCk9LWluZiAqLworICAgICAgICAgICAgaWYgKGh4PDApIHJldHVybiAoeC14KS96ZXJvOyAgICAgICAgLyogbG9nKC0jKSA9IE5hTiAqLworICAgICAgICAgICAgayAtPSAyNTsgeCAqPSB0d28yNTsgLyogc3Vibm9ybWFsIG51bWJlciwgc2NhbGUgdXAgeCAqLworCSAgICBHRVRfRkxPQVRfV09SRChoeCx4KTsKKyAgICAgICAgfQorCWlmIChoeCA+PSAweDdmODAwMDAwKSByZXR1cm4geCt4OworCWsgKz0gKGh4Pj4yMyktMTI3OworCWkgID0gKCh1X2ludDMyX3QpayYweDgwMDAwMDAwKT4+MzE7CisgICAgICAgIGh4ID0gKGh4JjB4MDA3ZmZmZmYpfCgoMHg3Zi1pKTw8MjMpOworICAgICAgICB5ICA9IChmbG9hdCkoaytpKTsKKwlTRVRfRkxPQVRfV09SRCh4LGh4KTsKKwl6ICA9IHkqbG9nMTBfMmxvICsgaXZsbjEwKl9faWVlZTc1NF9sb2dmKHgpOworCXJldHVybiAgeit5KmxvZzEwXzJoaTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfbG9nZi5jIGIvbGlibS9zcmMvZV9sb2dmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZTJhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfbG9nZi5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIGVfbG9nZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9sb2cuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfbG9nZi5jLHYgMS44IDIwMDUvMTEvMTIgMTg6MjA6MDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK2xuMl9oaSA9ICAgNi45MzEzODEyMjU2ZS0wMSwJLyogMHgzZjMxNzE4MCAqLworbG4yX2xvID0gICA5LjA1ODAwMDYxNDVlLTA2LAkvKiAweDM3MTdmN2QxICovCit0d28yNSA9ICAgIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLworLyogfChsb2coMStzKS1sb2coMS1zKSkvcyAtIExnKHMpfCA8IDIqKi0zNC4yNCAoflstNC45NWUtMTEsIDQuOTdlLTExXSkuICovCitMZzEgPSAgICAgIDB4YWFhYWFhLjBwLTI0LAkvKiAwLjY2NjY2NjYyNjkzICovCitMZzIgPSAgICAgIDB4Y2NjZTEzLjBwLTI1LAkvKiAwLjQwMDAwOTcyMTUyICovCitMZzMgPSAgICAgIDB4OTFlOWVlLjBwLTI1LAkvKiAwLjI4NDk4Nzg2Njg4ICovCitMZzQgPSAgICAgIDB4Zjg5ZTI2LjBwLTI2OwkvKiAwLjI0Mjc5MDc4ODQxICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvICAgPSAgMC4wOworCitmbG9hdAorX19pZWVlNzU0X2xvZ2YoZmxvYXQgeCkKK3sKKwlmbG9hdCBoZnNxLGYscyx6LFIsdyx0MSx0MixkazsKKwlpbnQzMl90IGssaXgsaSxqOworCisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisKKwlrPTA7CisJaWYgKGl4IDwgMHgwMDgwMDAwMCkgewkJCS8qIHggPCAyKiotMTI2ICAqLworCSAgICBpZiAoKGl4JjB4N2ZmZmZmZmYpPT0wKQorCQlyZXR1cm4gLXR3bzI1L3plcm87CQkvKiBsb2coKy0wKT0taW5mICovCisJICAgIGlmIChpeDwwKSByZXR1cm4gKHgteCkvemVybzsJLyogbG9nKC0jKSA9IE5hTiAqLworCSAgICBrIC09IDI1OyB4ICo9IHR3bzI1OyAvKiBzdWJub3JtYWwgbnVtYmVyLCBzY2FsZSB1cCB4ICovCisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCX0KKwlpZiAoaXggPj0gMHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlrICs9IChpeD4+MjMpLTEyNzsKKwlpeCAmPSAweDAwN2ZmZmZmOworCWkgPSAoaXgrKDB4OTVmNjQ8PDMpKSYweDgwMDAwMDsKKwlTRVRfRkxPQVRfV09SRCh4LGl4fChpXjB4M2Y4MDAwMDApKTsJLyogbm9ybWFsaXplIHggb3IgeC8yICovCisJayArPSAoaT4+MjMpOworCWYgPSB4LShmbG9hdCkxLjA7CisJaWYoKDB4MDA3ZmZmZmYmKDE1K2l4KSk8MTYpIHsJLyogfGZ8IDwgMioqLTIwICovCisJICAgIGlmKGY9PXplcm8pIGlmKGs9PTApIHJldHVybiB6ZXJvOyAgZWxzZSB7ZGs9KGZsb2F0KWs7CisJCQkJIHJldHVybiBkaypsbjJfaGkrZGsqbG4yX2xvO30KKwkgICAgUiA9IGYqZiooKGZsb2F0KTAuNS0oZmxvYXQpMC4zMzMzMzMzMzMzMzMzMzMzMypmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZSB7ZGs9KGZsb2F0KWs7CisJICAgIAkgICAgIHJldHVybiBkaypsbjJfaGktKChSLWRrKmxuMl9sbyktZik7fQorCX0KKyAJcyA9IGYvKChmbG9hdCkyLjArZik7CisJZGsgPSAoZmxvYXQpazsKKwl6ID0gcypzOworCWkgPSBpeC0oMHg2MTQ3YTw8Myk7CisJdyA9IHoqejsKKwlqID0gKDB4NmI4NTE8PDMpLWl4OworCXQxPSB3KihMZzIrdypMZzQpOworCXQyPSB6KihMZzErdypMZzMpOworCWkgfD0gajsKKwlSID0gdDIrdDE7CisJaWYoaT4wKSB7CisJICAgIGhmc3E9KGZsb2F0KTAuNSpmKmY7CisJICAgIGlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSAgICAgcmV0dXJuIGRrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrZGsqbG4yX2xvKSktZik7CisJfSBlbHNlIHsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtcyooZi1SKTsgZWxzZQorCQkgICAgIHJldHVybiBkaypsbjJfaGktKChzKihmLVIpLWRrKmxuMl9sbyktZik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9wb3cuYyBiL2xpYm0vc3JjL2VfcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMzEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcG93LmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qIEAoIyllX3Bvdy5jIDEuNSAwNC8wNC8yMiBTTUkgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3Bvdy5jLHYgMS4xMSAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3Bvdyh4LHkpIHJldHVybiB4Kip5CisgKgorICoJCSAgICAgIG4KKyAqIE1ldGhvZDogIExldCB4ID0gIDIgICAqICgxK2YpCisgKgkxLiBDb21wdXRlIGFuZCByZXR1cm4gbG9nMih4KSBpbiB0d28gcGllY2VzOgorICoJCWxvZzIoeCkgPSB3MSArIHcyLAorICoJICAgd2hlcmUgdzEgaGFzIDUzLTI0ID0gMjkgYml0IHRyYWlsaW5nIHplcm9zLgorICoJMi4gUGVyZm9ybSB5KmxvZzIoeCkgPSBuK3knIGJ5IHNpbXVsYXRpbmcgbXV0aS1wcmVjaXNpb24gCisgKgkgICBhcml0aG1ldGljLCB3aGVyZSB8eSd8PD0wLjUuCisgKgkzLiBSZXR1cm4geCoqeSA9IDIqKm4qZXhwKHknKmxvZzIpCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqCTEuICAoYW55dGhpbmcpICoqIDAgIGlzIDEKKyAqCTIuICAoYW55dGhpbmcpICoqIDEgIGlzIGl0c2VsZgorICoJMy4gIChhbnl0aGluZykgKiogTkFOIGlzIE5BTgorICoJNC4gIE5BTiAqKiAoYW55dGhpbmcgZXhjZXB0IDApIGlzIE5BTgorICoJNS4gICstKHx4fCA+IDEpICoqICArSU5GIGlzICtJTkYKKyAqCTYuICArLSh8eHwgPiAxKSAqKiAgLUlORiBpcyArMAorICoJNy4gICstKHx4fCA8IDEpICoqICArSU5GIGlzICswCisgKgk4LiAgKy0ofHh8IDwgMSkgKiogIC1JTkYgaXMgK0lORgorICoJOS4gICstMSAgICAgICAgICoqICstSU5GIGlzIE5BTgorICoJMTAuICswICoqICgrYW55dGhpbmcgZXhjZXB0IDAsIE5BTikgICAgICAgICAgICAgICBpcyArMAorICoJMTEuIC0wICoqICgrYW55dGhpbmcgZXhjZXB0IDAsIE5BTiwgb2RkIGludGVnZXIpICBpcyArMAorICoJMTIuICswICoqICgtYW55dGhpbmcgZXhjZXB0IDAsIE5BTikgICAgICAgICAgICAgICBpcyArSU5GCisgKgkxMy4gLTAgKiogKC1hbnl0aGluZyBleGNlcHQgMCwgTkFOLCBvZGQgaW50ZWdlcikgIGlzICtJTkYKKyAqCTE0LiAtMCAqKiAob2RkIGludGVnZXIpID0gLSggKzAgKiogKG9kZCBpbnRlZ2VyKSApCisgKgkxNS4gK0lORiAqKiAoK2FueXRoaW5nIGV4Y2VwdCAwLE5BTikgaXMgK0lORgorICoJMTYuICtJTkYgKiogKC1hbnl0aGluZyBleGNlcHQgMCxOQU4pIGlzICswCisgKgkxNy4gLUlORiAqKiAoYW55dGhpbmcpICA9IC0wICoqICgtYW55dGhpbmcpCisgKgkxOC4gKC1hbnl0aGluZykgKiogKGludGVnZXIpIGlzICgtMSkqKihpbnRlZ2VyKSooK2FueXRoaW5nKippbnRlZ2VyKQorICoJMTkuICgtYW55dGhpbmcgZXhjZXB0IDAgYW5kIGluZikgKiogKG5vbi1pbnRlZ2VyKSBpcyBOQU4KKyAqCisgKiBBY2N1cmFjeToKKyAqCXBvdyh4LHkpIHJldHVybnMgeCoqeSBuZWFybHkgcm91bmRlZC4gSW4gcGFydGljdWxhcgorICoJCQlwb3coaW50ZWdlcixpbnRlZ2VyKQorICoJYWx3YXlzIHJldHVybnMgdGhlIGNvcnJlY3QgaW50ZWdlciBwcm92aWRlZCBpdCBpcyAKKyAqCXJlcHJlc2VudGFibGUuCisgKgorICogQ29uc3RhbnRzIDoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nIAorICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlIAorICogY29tcGlsZXIgd2lsbCBjb252ZXJ0IGZyb20gZGVjaW1hbCB0byBiaW5hcnkgYWNjdXJhdGVseSBlbm91Z2ggCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorYnBbXSA9IHsxLjAsIDEuNSx9LAorZHBfaFtdID0geyAwLjAsIDUuODQ5NjI0ODcyMjA3NjQxNjAxNTZlLTAxLH0sIC8qIDB4M0ZFMkI4MDMsIDB4NDAwMDAwMDAgKi8KK2RwX2xbXSA9IHsgMC4wLCAxLjM1MDAzOTIwMjEyOTc0ODk3MTI4ZS0wOCx9LCAvKiAweDNFNENGREVCLCAweDQzQ0ZEMDA2ICovCit6ZXJvICAgID0gIDAuMCwKK29uZQk9ICAxLjAsCit0d28JPSAgMi4wLAordHdvNTMJPSAgOTAwNzE5OTI1NDc0MDk5Mi4wLAkvKiAweDQzNDAwMDAwLCAweDAwMDAwMDAwICovCitodWdlCT0gIDEuMGUzMDAsCit0aW55ICAgID0gIDEuMGUtMzAwLAorCS8qIHBvbHkgY29lZnMgZm9yICgzLzIpKihsb2coeCktMnMtMi8zKnMqKjMgKi8KK0wxICA9ICA1Ljk5OTk5OTk5OTk5OTk0NjQ4NzI1ZS0wMSwgLyogMHgzRkUzMzMzMywgMHgzMzMzMzMwMyAqLworTDIgID0gIDQuMjg1NzE0Mjg1Nzg1NTAxODQyNTJlLTAxLCAvKiAweDNGREI2REI2LCAweERCNkZBQkZGICovCitMMyAgPSAgMy4zMzMzMzMyOTgxODM3NzQzMjkxOGUtMDEsIC8qIDB4M0ZENTU1NTUsIDB4NTE4RjI2NEQgKi8KK0w0ICA9ICAyLjcyNzI4MTIzODA4NTM0MDA2NDg5ZS0wMSwgLyogMHgzRkQxNzQ2MCwgMHhBOTFENDEwMSAqLworTDUgID0gIDIuMzA2NjA3NDU3NzU1NjE3NTQwNjdlLTAxLCAvKiAweDNGQ0Q4NjRBLCAweDkzQzlEQjY1ICovCitMNiAgPSAgMi4wNjk3NTAxNzgwMDMzODQxNzc4NGUtMDEsIC8qIDB4M0ZDQTdFMjgsIDB4NEE0NTRFRUYgKi8KK1AxICAgPSAgMS42NjY2NjY2NjY2NjY2NjAxOTAzN2UtMDEsIC8qIDB4M0ZDNTU1NTUsIDB4NTU1NTU1M0UgKi8KK1AyICAgPSAtMi43Nzc3Nzc3Nzc3MDE1NTkzMzg0MmUtMDMsIC8qIDB4QkY2NkMxNkMsIDB4MTZCRUJEOTMgKi8KK1AzICAgPSAgNi42MTM3NTYzMjE0Mzc5MzQzNjExN2UtMDUsIC8qIDB4M0YxMTU2NkEsIDB4QUYyNURFMkMgKi8KK1A0ICAgPSAtMS42NTMzOTAyMjA1NDY1MjUxNTM5MGUtMDYsIC8qIDB4QkVCQkJENDEsIDB4QzVEMjZCRjEgKi8KK1A1ICAgPSAgNC4xMzgxMzY3OTcwNTcyMzg0NjAzOWUtMDgsIC8qIDB4M0U2NjM3NjksIDB4NzJCRUE0RDAgKi8KK2xnMiAgPSAgNi45MzE0NzE4MDU1OTk0NTI4NjIyN2UtMDEsIC8qIDB4M0ZFNjJFNDIsIDB4RkVGQTM5RUYgKi8KK2xnMl9oICA9ICA2LjkzMTQ3MTgyNDY0NTk5NjA5Mzc1ZS0wMSwgLyogMHgzRkU2MkU0MywgMHgwMDAwMDAwMCAqLworbGcyX2wgID0gLTEuOTA0NjU0Mjk5OTU3NzY4MDQ1MjVlLTA5LCAvKiAweEJFMjA1QzYxLCAweDBDQTg2QzM5ICovCitvdnQgPSAgOC4wMDg1NjYyNTk1MzcyOTQ0MzcyZS0wMDE3LCAvKiAtKDEwMjQtbG9nMihvdmZsKy41dWxwKSkgKi8KK2NwICAgID0gIDkuNjE3OTY2OTM5MjU5NzU1NTQzMjllLTAxLCAvKiAweDNGRUVDNzA5LCAweERDM0EwM0ZEID0yLygzbG4yKSAqLworY3BfaCAgPSAgOS42MTc5NjcwMDk1NDQzNzI1NTg1OWUtMDEsIC8qIDB4M0ZFRUM3MDksIDB4RTAwMDAwMDAgPShmbG9hdCljcCAqLworY3BfbCAgPSAtNy4wMjg0NjE2NTA5NTI3NTgyNjUxNmUtMDksIC8qIDB4QkUzRTJGRTAsIDB4MTQ1QjAxRjUgPXRhaWwgb2YgY3BfaCovCitpdmxuMiAgICA9ICAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwZSswMCwgLyogMHgzRkY3MTU0NywgMHg2NTJCODJGRSA9MS9sbjIgKi8KK2l2bG4yX2ggID0gIDEuNDQyNjk1MDIxNjI5MzMzNDk2MDllKzAwLCAvKiAweDNGRjcxNTQ3LCAweDYwMDAwMDAwID0yNGIgMS9sbjIqLworaXZsbjJfbCAgPSAgMS45MjU5NjI5OTExMjY2MTc0Njg4N2UtMDg7IC8qIDB4M0U1NEFFMEIsIDB4Rjg1RERGNDQgPTEvbG4yIHRhaWwqLworCitkb3VibGUKK19faWVlZTc1NF9wb3coZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSB6LGF4LHpfaCx6X2wscF9oLHBfbDsKKwlkb3VibGUgeTEsdDEsdDIscixzLHQsdSx2LHc7CisJaW50MzJfdCBpLGosayx5aXNpbnQsbjsKKwlpbnQzMl90IGh4LGh5LGl4LGl5OworCXVfaW50MzJfdCBseCxseTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7ICBpeSA9IGh5JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB5PT16ZXJvOiB4KiowID0gMSAqLworCWlmKChpeXxseSk9PTApIHJldHVybiBvbmU7IAkKKworICAgIC8qICstTmFOIHJldHVybiB4K3kgKi8KKwlpZihpeCA+IDB4N2ZmMDAwMDAgfHwgKChpeD09MHg3ZmYwMDAwMCkmJihseCE9MCkpIHx8CisJICAgaXkgPiAweDdmZjAwMDAwIHx8ICgoaXk9PTB4N2ZmMDAwMDApJiYobHkhPTApKSkgCisJCXJldHVybiB4K3k7CQorCisgICAgLyogZGV0ZXJtaW5lIGlmIHkgaXMgYW4gb2RkIGludCB3aGVuIHggPCAwCisgICAgICogeWlzaW50ID0gMAkuLi4geSBpcyBub3QgYW4gaW50ZWdlcgorICAgICAqIHlpc2ludCA9IDEJLi4uIHkgaXMgYW4gb2RkIGludAorICAgICAqIHlpc2ludCA9IDIJLi4uIHkgaXMgYW4gZXZlbiBpbnQKKyAgICAgKi8KKwl5aXNpbnQgID0gMDsKKwlpZihoeDwwKSB7CQorCSAgICBpZihpeT49MHg0MzQwMDAwMCkgeWlzaW50ID0gMjsgLyogZXZlbiBpbnRlZ2VyIHkgKi8KKwkgICAgZWxzZSBpZihpeT49MHgzZmYwMDAwMCkgeworCQlrID0gKGl5Pj4yMCktMHgzZmY7CSAgIC8qIGV4cG9uZW50ICovCisJCWlmKGs+MjApIHsKKwkJICAgIGogPSBseT4+KDUyLWspOworCQkgICAgaWYoKGo8PCg1Mi1rKSk9PWx5KSB5aXNpbnQgPSAyLShqJjEpOworCQl9IGVsc2UgaWYobHk9PTApIHsKKwkJICAgIGogPSBpeT4+KDIwLWspOworCQkgICAgaWYoKGo8PCgyMC1rKSk9PWl5KSB5aXNpbnQgPSAyLShqJjEpOworCQl9CisJICAgIH0JCQorCX0gCisKKyAgICAvKiBzcGVjaWFsIHZhbHVlIG9mIHkgKi8KKwlpZihseT09MCkgeyAJCisJICAgIGlmIChpeT09MHg3ZmYwMDAwMCkgewkvKiB5IGlzICstaW5mICovCisJICAgICAgICBpZigoKGl4LTB4M2ZmMDAwMDApfGx4KT09MCkKKwkJICAgIHJldHVybiAgeSAtIHk7CS8qIGluZioqKy0xIGlzIE5hTiAqLworCSAgICAgICAgZWxzZSBpZiAoaXggPj0gMHgzZmYwMDAwMCkvKiAofHh8PjEpKiorLWluZiA9IGluZiwwICovCisJCSAgICByZXR1cm4gKGh5Pj0wKT8geTogemVybzsKKwkgICAgICAgIGVsc2UJCQkvKiAofHh8PDEpKiotLCtpbmYgPSBpbmYsMCAqLworCQkgICAgcmV0dXJuIChoeTwwKT8teTogemVybzsKKwkgICAgfSAKKwkgICAgaWYoaXk9PTB4M2ZmMDAwMDApIHsJLyogeSBpcyAgKy0xICovCisJCWlmKGh5PDApIHJldHVybiBvbmUveDsgZWxzZSByZXR1cm4geDsKKwkgICAgfQorCSAgICBpZihoeT09MHg0MDAwMDAwMCkgcmV0dXJuIHgqeDsgLyogeSBpcyAgMiAqLworCSAgICBpZihoeT09MHgzZmUwMDAwMCkgewkvKiB5IGlzICAwLjUgKi8KKwkJaWYoaHg+PTApCS8qIHggPj0gKzAgKi8KKwkJcmV0dXJuIHNxcnQoeCk7CQorCSAgICB9CisJfQorCisJYXggICA9IGZhYnMoeCk7CisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB4ICovCisJaWYobHg9PTApIHsKKwkgICAgaWYoaXg9PTB4N2ZmMDAwMDB8fGl4PT0wfHxpeD09MHgzZmYwMDAwMCl7CisJCXogPSBheDsJCQkvKnggaXMgKy0wLCstaW5mLCstMSovCisJCWlmKGh5PDApIHogPSBvbmUvejsJLyogeiA9ICgxL3x4fCkgKi8KKwkJaWYoaHg8MCkgeworCQkgICAgaWYoKChpeC0weDNmZjAwMDAwKXx5aXNpbnQpPT0wKSB7CisJCQl6ID0gKHoteikvKHoteik7IC8qICgtMSkqKm5vbi1pbnQgaXMgTmFOICovCisJCSAgICB9IGVsc2UgaWYoeWlzaW50PT0xKSAKKwkJCXogPSAtejsJCS8qICh4PDApKipvZGQgPSAtKHx4fCoqb2RkKSAqLworCQl9CisJCXJldHVybiB6OworCSAgICB9CisJfQorICAgIAorICAgIC8qIENZR05VUyBMT0NBTCArIGZkbGlibS01LjMgZml4OiBUaGlzIHVzZWQgdG8gYmUKKwluID0gKGh4Pj4zMSkrMTsKKyAgICAgICBidXQgQU5TSSBDIHNheXMgYSByaWdodCBzaGlmdCBvZiBhIHNpZ25lZCBuZWdhdGl2ZSBxdWFudGl0eSBpcworICAgICAgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICAqLworCW4gPSAoKHVfaW50MzJfdCloeD4+MzEpLTE7CisKKyAgICAvKiAoeDwwKSoqKG5vbi1pbnQpIGlzIE5hTiAqLworCWlmKChufHlpc2ludCk9PTApIHJldHVybiAoeC14KS8oeC14KTsKKworCXMgPSBvbmU7IC8qIHMgKHNpZ24gb2YgcmVzdWx0IC12ZSoqb2RkKSA9IC0xIGVsc2UgPSAxICovCisJaWYoKG58KHlpc2ludC0xKSk9PTApIHMgPSAtb25lOy8qICgtdmUpKioob2RkIGludCkgKi8KKworICAgIC8qIHx5fCBpcyBodWdlICovCisJaWYoaXk+MHg0MWUwMDAwMCkgeyAvKiBpZiB8eXwgPiAyKiozMSAqLworCSAgICBpZihpeT4weDQzZjAwMDAwKXsJLyogaWYgfHl8ID4gMioqNjQsIG11c3Qgby91ZmxvdyAqLworCQlpZihpeDw9MHgzZmVmZmZmZikgcmV0dXJuIChoeTwwKT8gaHVnZSpodWdlOnRpbnkqdGlueTsKKwkJaWYoaXg+PTB4M2ZmMDAwMDApIHJldHVybiAoaHk+MCk/IGh1Z2UqaHVnZTp0aW55KnRpbnk7CisJICAgIH0KKwkvKiBvdmVyL3VuZGVyZmxvdyBpZiB4IGlzIG5vdCBjbG9zZSB0byBvbmUgKi8KKwkgICAgaWYoaXg8MHgzZmVmZmZmZikgcmV0dXJuIChoeTwwKT8gcypodWdlKmh1Z2U6cyp0aW55KnRpbnk7CisJICAgIGlmKGl4PjB4M2ZmMDAwMDApIHJldHVybiAoaHk+MCk/IHMqaHVnZSpodWdlOnMqdGlueSp0aW55OworCS8qIG5vdyB8MS14fCBpcyB0aW55IDw9IDIqKi0yMCwgc3VmZmljZSB0byBjb21wdXRlIAorCSAgIGxvZyh4KSBieSB4LXheMi8yK3heMy8zLXheNC80ICovCisJICAgIHQgPSBheC1vbmU7CQkvKiB0IGhhcyAyMCB0cmFpbGluZyB6ZXJvcyAqLworCSAgICB3ID0gKHQqdCkqKDAuNS10KigwLjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMtdCowLjI1KSk7CisJICAgIHUgPSBpdmxuMl9oKnQ7CS8qIGl2bG4yX2ggaGFzIDIxIHNpZy4gYml0cyAqLworCSAgICB2ID0gdCppdmxuMl9sLXcqaXZsbjI7CisJICAgIHQxID0gdSt2OworCSAgICBTRVRfTE9XX1dPUkQodDEsMCk7CisJICAgIHQyID0gdi0odDEtdSk7CisJfSBlbHNlIHsKKwkgICAgZG91YmxlIHNzLHMyLHNfaCxzX2wsdF9oLHRfbDsKKwkgICAgbiA9IDA7CisJLyogdGFrZSBjYXJlIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgaWYoaXg8MHgwMDEwMDAwMCkKKwkJe2F4ICo9IHR3bzUzOyBuIC09IDUzOyBHRVRfSElHSF9XT1JEKGl4LGF4KTsgfQorCSAgICBuICArPSAoKGl4KT4+MjApLTB4M2ZmOworCSAgICBqICA9IGl4JjB4MDAwZmZmZmY7CisJLyogZGV0ZXJtaW5lIGludGVydmFsICovCisJICAgIGl4ID0ganwweDNmZjAwMDAwOwkJLyogbm9ybWFsaXplIGl4ICovCisJICAgIGlmKGo8PTB4Mzk4OEUpIGs9MDsJCS8qIHx4fDxzcXJ0KDMvMikgKi8KKwkgICAgZWxzZSBpZihqPDB4QkI2N0EpIGs9MTsJLyogfHh8PHNxcnQoMykgICAqLworCSAgICBlbHNlIHtrPTA7bis9MTtpeCAtPSAweDAwMTAwMDAwO30KKwkgICAgU0VUX0hJR0hfV09SRChheCxpeCk7CisKKwkvKiBjb21wdXRlIHNzID0gc19oK3NfbCA9ICh4LTEpLyh4KzEpIG9yICh4LTEuNSkvKHgrMS41KSAqLworCSAgICB1ID0gYXgtYnBba107CQkvKiBicFswXT0xLjAsIGJwWzFdPTEuNSAqLworCSAgICB2ID0gb25lLyhheCticFtrXSk7CisJICAgIHNzID0gdSp2OworCSAgICBzX2ggPSBzczsKKwkgICAgU0VUX0xPV19XT1JEKHNfaCwwKTsKKwkvKiB0X2g9YXgrYnBba10gSGlnaCAqLworCSAgICB0X2ggPSB6ZXJvOworCSAgICBTRVRfSElHSF9XT1JEKHRfaCwoKGl4Pj4xKXwweDIwMDAwMDAwKSsweDAwMDgwMDAwKyhrPDwxOCkpOworCSAgICB0X2wgPSBheCAtICh0X2gtYnBba10pOworCSAgICBzX2wgPSB2KigodS1zX2gqdF9oKS1zX2gqdF9sKTsKKwkvKiBjb21wdXRlIGxvZyhheCkgKi8KKwkgICAgczIgPSBzcypzczsKKwkgICAgciA9IHMyKnMyKihMMStzMiooTDIrczIqKEwzK3MyKihMNCtzMiooTDUrczIqTDYpKSkpKTsKKwkgICAgciArPSBzX2wqKHNfaCtzcyk7CisJICAgIHMyICA9IHNfaCpzX2g7CisJICAgIHRfaCA9IDMuMCtzMityOworCSAgICBTRVRfTE9XX1dPUkQodF9oLDApOworCSAgICB0X2wgPSByLSgodF9oLTMuMCktczIpOworCS8qIHUrdiA9IHNzKigxKy4uLikgKi8KKwkgICAgdSA9IHNfaCp0X2g7CisJICAgIHYgPSBzX2wqdF9oK3RfbCpzczsKKwkvKiAyLygzbG9nMikqKHNzKy4uLikgKi8KKwkgICAgcF9oID0gdSt2OworCSAgICBTRVRfTE9XX1dPUkQocF9oLDApOworCSAgICBwX2wgPSB2LShwX2gtdSk7CisJICAgIHpfaCA9IGNwX2gqcF9oOwkJLyogY3BfaCtjcF9sID0gMi8oMypsb2cyKSAqLworCSAgICB6X2wgPSBjcF9sKnBfaCtwX2wqY3ArZHBfbFtrXTsKKwkvKiBsb2cyKGF4KSA9IChzcysuLikqMi8oMypsb2cyKSA9IG4gKyBkcF9oICsgel9oICsgel9sICovCisJICAgIHQgPSAoZG91YmxlKW47CisJICAgIHQxID0gKCgoel9oK3pfbCkrZHBfaFtrXSkrdCk7CisJICAgIFNFVF9MT1dfV09SRCh0MSwwKTsKKwkgICAgdDIgPSB6X2wtKCgodDEtdCktZHBfaFtrXSktel9oKTsKKwl9CisKKyAgICAvKiBzcGxpdCB1cCB5IGludG8geTEreTIgYW5kIGNvbXB1dGUgKHkxK3kyKSoodDErdDIpICovCisJeTEgID0geTsKKwlTRVRfTE9XX1dPUkQoeTEsMCk7CisJcF9sID0gKHkteTEpKnQxK3kqdDI7CisJcF9oID0geTEqdDE7CisJeiA9IHBfbCtwX2g7CisJRVhUUkFDVF9XT1JEUyhqLGkseik7CisJaWYgKGo+PTB4NDA5MDAwMDApIHsJCQkJLyogeiA+PSAxMDI0ICovCisJICAgIGlmKCgoai0weDQwOTAwMDAwKXxpKSE9MCkJCQkvKiBpZiB6ID4gMTAyNCAqLworCQlyZXR1cm4gcypodWdlKmh1Z2U7CQkJLyogb3ZlcmZsb3cgKi8KKwkgICAgZWxzZSB7CisJCWlmKHBfbCtvdnQ+ei1wX2gpIHJldHVybiBzKmh1Z2UqaHVnZTsJLyogb3ZlcmZsb3cgKi8KKwkgICAgfQorCX0gZWxzZSBpZigoaiYweDdmZmZmZmZmKT49MHg0MDkwY2MwMCApIHsJLyogeiA8PSAtMTA3NSAqLworCSAgICBpZigoKGotMHhjMDkwY2MwMCl8aSkhPTApIAkJLyogeiA8IC0xMDc1ICovCisJCXJldHVybiBzKnRpbnkqdGlueTsJCS8qIHVuZGVyZmxvdyAqLworCSAgICBlbHNlIHsKKwkJaWYocF9sPD16LXBfaCkgcmV0dXJuIHMqdGlueSp0aW55OwkvKiB1bmRlcmZsb3cgKi8KKwkgICAgfQorCX0KKyAgICAvKgorICAgICAqIGNvbXB1dGUgMioqKHBfaCtwX2wpCisgICAgICovCisJaSA9IGomMHg3ZmZmZmZmZjsKKwlrID0gKGk+PjIwKS0weDNmZjsKKwluID0gMDsKKwlpZihpPjB4M2ZlMDAwMDApIHsJCS8qIGlmIHx6fCA+IDAuNSwgc2V0IG4gPSBbeiswLjVdICovCisJICAgIG4gPSBqKygweDAwMTAwMDAwPj4oaysxKSk7CisJICAgIGsgPSAoKG4mMHg3ZmZmZmZmZik+PjIwKS0weDNmZjsJLyogbmV3IGsgZm9yIG4gKi8KKwkgICAgdCA9IHplcm87CisJICAgIFNFVF9ISUdIX1dPUkQodCxuJn4oMHgwMDBmZmZmZj4+aykpOworCSAgICBuID0gKChuJjB4MDAwZmZmZmYpfDB4MDAxMDAwMDApPj4oMjAtayk7CisJICAgIGlmKGo8MCkgbiA9IC1uOworCSAgICBwX2ggLT0gdDsKKwl9IAorCXQgPSBwX2wrcF9oOworCVNFVF9MT1dfV09SRCh0LDApOworCXUgPSB0KmxnMl9oOworCXYgPSAocF9sLSh0LXBfaCkpKmxnMit0KmxnMl9sOworCXogPSB1K3Y7CisJdyA9IHYtKHotdSk7CisJdCAgPSB6Kno7CisJdDEgID0geiAtIHQqKFAxK3QqKFAyK3QqKFAzK3QqKFA0K3QqUDUpKSkpOworCXIgID0gKHoqdDEpLyh0MS10d28pLSh3K3oqdyk7CisJeiAgPSBvbmUtKHIteik7CisJR0VUX0hJR0hfV09SRChqLHopOworCWogKz0gKG48PDIwKTsKKwlpZigoaj4+MjApPD0wKSB6ID0gc2NhbGJuKHosbik7CS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwllbHNlIFNFVF9ISUdIX1dPUkQoeixqKTsKKwlyZXR1cm4gcyp6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9wb3dmLmMgYi9saWJtL3NyYy9lX3Bvd2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYwOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9wb3dmLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGVfcG93Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9wb3cuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcG93Zi5jLHYgMS4xMiAyMDA0LzA2LzAxIDE5OjMzOjMwIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CiticFtdID0gezEuMCwgMS41LH0sCitkcF9oW10gPSB7IDAuMCwgNS44NDk2MDkzOGUtMDEsfSwgLyogMHgzZjE1YzAwMCAqLworZHBfbFtdID0geyAwLjAsIDEuNTYzMjIwODVlLTA2LH0sIC8qIDB4MzVkMWNmZGMgKi8KK3plcm8gICAgPSAgMC4wLAorb25lCT0gIDEuMCwKK3R3bwk9ICAyLjAsCit0d28yNAk9ICAxNjc3NzIxNi4wLAkvKiAweDRiODAwMDAwICovCitodWdlCT0gIDEuMGUzMCwKK3RpbnkgICAgPSAgMS4wZS0zMCwKKwkvKiBwb2x5IGNvZWZzIGZvciAoMy8yKSoobG9nKHgpLTJzLTIvMypzKiozICovCitMMSAgPSAgNi4wMDAwMDAyMzg0ZS0wMSwgLyogMHgzZjE5OTk5YSAqLworTDIgID0gIDQuMjg1NzE0MzI4M2UtMDEsIC8qIDB4M2VkYjZkYjcgKi8KK0wzICA9ICAzLjMzMzMzMzQzMjdlLTAxLCAvKiAweDNlYWFhYWFiICovCitMNCAgPSAgMi43MjcyODExNTMyZS0wMSwgLyogMHgzZThiYTMwNSAqLworTDUgID0gIDIuMzA2NjA3NTE0NmUtMDEsIC8qIDB4M2U2YzMyNTUgKi8KK0w2ICA9ICAyLjA2OTc1MDEzMDJlLTAxLCAvKiAweDNlNTNmMTQyICovCitQMSAgID0gIDEuNjY2NjY2NzE2M2UtMDEsIC8qIDB4M2UyYWFhYWIgKi8KK1AyICAgPSAtMi43Nzc3Nzc4NDUwZS0wMywgLyogMHhiYjM2MGI2MSAqLworUDMgICA9ICA2LjYxMzc1NTk3NzBlLTA1LCAvKiAweDM4OGFiMzU1ICovCitQNCAgID0gLTEuNjUzMzkwMTk5OWUtMDYsIC8qIDB4YjVkZGVhMGUgKi8KK1A1ICAgPSAgNC4xMzgxMzY5NDQyZS0wOCwgLyogMHgzMzMxYmI0YyAqLworbGcyICA9ICA2LjkzMTQ3MTgyNDZlLTAxLCAvKiAweDNmMzE3MjE4ICovCitsZzJfaCAgPSAgNi45MzE0NTc1MmUtMDEsIC8qIDB4M2YzMTcyMDAgKi8KK2xnMl9sICA9ICAxLjQyODYwNjU0ZS0wNiwgLyogMHgzNWJmYmU4YyAqLworb3Z0ID0gIDQuMjk5NTY2NTY5NGUtMDgsIC8qIC0oMTI4LWxvZzIob3ZmbCsuNXVscCkpICovCitjcCAgICA9ICA5LjYxNzk2NzAwOTVlLTAxLCAvKiAweDNmNzYzODRmID0yLygzbG4yKSAqLworY3BfaCAgPSAgOS42MTc5MTk5MjE5ZS0wMSwgLyogMHgzZjc2MzgwMCA9aGVhZCBvZiBjcCAqLworY3BfbCAgPSAgNC43MDE3MzgzNjIyZS0wNiwgLyogMHgzNjlkYzNhMCA9dGFpbCBvZiBjcF9oICovCitpdmxuMiAgICA9ICAxLjQ0MjY5NTAyMTZlKzAwLCAvKiAweDNmYjhhYTNiID0xL2xuMiAqLworaXZsbjJfaCAgPSAgMS40NDI2ODc5ODgzZSswMCwgLyogMHgzZmI4YWEwMCA9MTZiIDEvbG4yKi8KK2l2bG4yX2wgID0gIDcuMDUyNjA3NTQzM2UtMDY7IC8qIDB4MzZlY2E1NzAgPTEvbG4yIHRhaWwqLworCitmbG9hdAorX19pZWVlNzU0X3Bvd2YoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwlmbG9hdCB6LGF4LHpfaCx6X2wscF9oLHBfbDsKKwlmbG9hdCB5MSx0MSx0MixyLHMsc24sdCx1LHYsdzsKKwlpbnQzMl90IGksaixrLHlpc2ludCxuOworCWludDMyX3QgaHgsaHksaXgsaXksaXM7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7ICBpeSA9IGh5JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB5PT16ZXJvOiB4KiowID0gMSAqLworCWlmKGl5PT0wKSByZXR1cm4gb25lOworCisgICAgLyogKy1OYU4gcmV0dXJuIHgreSAqLworCWlmKGl4ID4gMHg3ZjgwMDAwMCB8fAorCSAgIGl5ID4gMHg3ZjgwMDAwMCkKKwkJcmV0dXJuIHgreTsKKworICAgIC8qIGRldGVybWluZSBpZiB5IGlzIGFuIG9kZCBpbnQgd2hlbiB4IDwgMAorICAgICAqIHlpc2ludCA9IDAJLi4uIHkgaXMgbm90IGFuIGludGVnZXIKKyAgICAgKiB5aXNpbnQgPSAxCS4uLiB5IGlzIGFuIG9kZCBpbnQKKyAgICAgKiB5aXNpbnQgPSAyCS4uLiB5IGlzIGFuIGV2ZW4gaW50CisgICAgICovCisJeWlzaW50ICA9IDA7CisJaWYoaHg8MCkgeworCSAgICBpZihpeT49MHg0YjgwMDAwMCkgeWlzaW50ID0gMjsgLyogZXZlbiBpbnRlZ2VyIHkgKi8KKwkgICAgZWxzZSBpZihpeT49MHgzZjgwMDAwMCkgeworCQlrID0gKGl5Pj4yMyktMHg3ZjsJICAgLyogZXhwb25lbnQgKi8KKwkJaiA9IGl5Pj4oMjMtayk7CisJCWlmKChqPDwoMjMtaykpPT1peSkgeWlzaW50ID0gMi0oaiYxKTsKKwkgICAgfQorCX0KKworICAgIC8qIHNwZWNpYWwgdmFsdWUgb2YgeSAqLworCWlmIChpeT09MHg3ZjgwMDAwMCkgewkvKiB5IGlzICstaW5mICovCisJICAgIGlmIChpeD09MHgzZjgwMDAwMCkKKwkgICAgICAgIHJldHVybiAgeSAtIHk7CS8qIGluZioqKy0xIGlzIE5hTiAqLworCSAgICBlbHNlIGlmIChpeCA+IDB4M2Y4MDAwMDApLyogKHx4fD4xKSoqKy1pbmYgPSBpbmYsMCAqLworCSAgICAgICAgcmV0dXJuIChoeT49MCk/IHk6IHplcm87CisJICAgIGVsc2UJCQkvKiAofHh8PDEpKiotLCtpbmYgPSBpbmYsMCAqLworCSAgICAgICAgcmV0dXJuIChoeTwwKT8teTogemVybzsKKwl9CisJaWYoaXk9PTB4M2Y4MDAwMDApIHsJLyogeSBpcyAgKy0xICovCisJICAgIGlmKGh5PDApIHJldHVybiBvbmUveDsgZWxzZSByZXR1cm4geDsKKwl9CisJaWYoaHk9PTB4NDAwMDAwMDApIHJldHVybiB4Kng7IC8qIHkgaXMgIDIgKi8KKwlpZihoeT09MHgzZjAwMDAwMCkgewkvKiB5IGlzICAwLjUgKi8KKwkgICAgaWYoaHg+PTApCS8qIHggPj0gKzAgKi8KKwkgICAgcmV0dXJuIF9faWVlZTc1NF9zcXJ0Zih4KTsKKwl9CisKKwlheCAgID0gZmFic2YoeCk7CisgICAgLyogc3BlY2lhbCB2YWx1ZSBvZiB4ICovCisJaWYoaXg9PTB4N2Y4MDAwMDB8fGl4PT0wfHxpeD09MHgzZjgwMDAwMCl7CisJICAgIHogPSBheDsJCQkvKnggaXMgKy0wLCstaW5mLCstMSovCisJICAgIGlmKGh5PDApIHogPSBvbmUvejsJLyogeiA9ICgxL3x4fCkgKi8KKwkgICAgaWYoaHg8MCkgeworCQlpZigoKGl4LTB4M2Y4MDAwMDApfHlpc2ludCk9PTApIHsKKwkJICAgIHogPSAoei16KS8oei16KTsgLyogKC0xKSoqbm9uLWludCBpcyBOYU4gKi8KKwkJfSBlbHNlIGlmKHlpc2ludD09MSkKKwkJICAgIHogPSAtejsJCS8qICh4PDApKipvZGQgPSAtKHx4fCoqb2RkKSAqLworCSAgICB9CisJICAgIHJldHVybiB6OworCX0KKworCW4gPSAoKHVfaW50MzJfdCloeD4+MzEpLTE7CisKKyAgICAvKiAoeDwwKSoqKG5vbi1pbnQpIGlzIE5hTiAqLworCWlmKChufHlpc2ludCk9PTApIHJldHVybiAoeC14KS8oeC14KTsKKworCXNuID0gb25lOyAvKiBzIChzaWduIG9mIHJlc3VsdCAtdmUqKm9kZCkgPSAtMSBlbHNlID0gMSAqLworCWlmKChufCh5aXNpbnQtMSkpPT0wKSBzbiA9IC1vbmU7LyogKC12ZSkqKihvZGQgaW50KSAqLworCisgICAgLyogfHl8IGlzIGh1Z2UgKi8KKwlpZihpeT4weDRkMDAwMDAwKSB7IC8qIGlmIHx5fCA+IDIqKjI3ICovCisJLyogb3Zlci91bmRlcmZsb3cgaWYgeCBpcyBub3QgY2xvc2UgdG8gb25lICovCisJICAgIGlmKGl4PDB4M2Y3ZmZmZjgpIHJldHVybiAoaHk8MCk/IHNuKmh1Z2UqaHVnZTpzbip0aW55KnRpbnk7CisJICAgIGlmKGl4PjB4M2Y4MDAwMDcpIHJldHVybiAoaHk+MCk/IHNuKmh1Z2UqaHVnZTpzbip0aW55KnRpbnk7CisJLyogbm93IHwxLXh8IGlzIHRpbnkgPD0gMioqLTIwLCBzdWZmaWNlIHRvIGNvbXB1dGUKKwkgICBsb2coeCkgYnkgeC14XjIvMit4XjMvMy14XjQvNCAqLworCSAgICB0ID0gYXgtMTsJCS8qIHQgaGFzIDIwIHRyYWlsaW5nIHplcm9zICovCisJICAgIHcgPSAodCp0KSooKGZsb2F0KTAuNS10KigoZmxvYXQpMC4zMzMzMzMzMzMzMzMtdCooZmxvYXQpMC4yNSkpOworCSAgICB1ID0gaXZsbjJfaCp0OwkvKiBpdmxuMl9oIGhhcyAxNiBzaWcuIGJpdHMgKi8KKwkgICAgdiA9IHQqaXZsbjJfbC13Kml2bG4yOworCSAgICB0MSA9IHUrdjsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsdDEpOworCSAgICBTRVRfRkxPQVRfV09SRCh0MSxpcyYweGZmZmZmMDAwKTsKKwkgICAgdDIgPSB2LSh0MS11KTsKKwl9IGVsc2UgeworCSAgICBmbG9hdCBzMixzX2gsc19sLHRfaCx0X2w7CisJICAgIG4gPSAwOworCS8qIHRha2UgY2FyZSBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIGlmKGl4PDB4MDA4MDAwMDApCisJCXtheCAqPSB0d28yNDsgbiAtPSAyNDsgR0VUX0ZMT0FUX1dPUkQoaXgsYXgpOyB9CisJICAgIG4gICs9ICgoaXgpPj4yMyktMHg3ZjsKKwkgICAgaiAgPSBpeCYweDAwN2ZmZmZmOworCS8qIGRldGVybWluZSBpbnRlcnZhbCAqLworCSAgICBpeCA9IGp8MHgzZjgwMDAwMDsJCS8qIG5vcm1hbGl6ZSBpeCAqLworCSAgICBpZihqPD0weDFjYzQ3MSkgaz0wOwkvKiB8eHw8c3FydCgzLzIpICovCisJICAgIGVsc2UgaWYoajwweDVkYjNkNykgaz0xOwkvKiB8eHw8c3FydCgzKSAgICovCisJICAgIGVsc2Uge2s9MDtuKz0xO2l4IC09IDB4MDA4MDAwMDA7fQorCSAgICBTRVRfRkxPQVRfV09SRChheCxpeCk7CisKKwkvKiBjb21wdXRlIHMgPSBzX2grc19sID0gKHgtMSkvKHgrMSkgb3IgKHgtMS41KS8oeCsxLjUpICovCisJICAgIHUgPSBheC1icFtrXTsJCS8qIGJwWzBdPTEuMCwgYnBbMV09MS41ICovCisJICAgIHYgPSBvbmUvKGF4K2JwW2tdKTsKKwkgICAgcyA9IHUqdjsKKwkgICAgc19oID0gczsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXMsc19oKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoc19oLGlzJjB4ZmZmZmYwMDApOworCS8qIHRfaD1heCticFtrXSBIaWdoICovCisJICAgIGlzID0gKChpeD4+MSkmMHhmZmZmZjAwMCl8MHgyMDAwMDAwMDsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodF9oLGlzKzB4MDA0MDAwMDArKGs8PDIxKSk7CisJICAgIHRfbCA9IGF4IC0gKHRfaC1icFtrXSk7CisJICAgIHNfbCA9IHYqKCh1LXNfaCp0X2gpLXNfaCp0X2wpOworCS8qIGNvbXB1dGUgbG9nKGF4KSAqLworCSAgICBzMiA9IHMqczsKKwkgICAgciA9IHMyKnMyKihMMStzMiooTDIrczIqKEwzK3MyKihMNCtzMiooTDUrczIqTDYpKSkpKTsKKwkgICAgciArPSBzX2wqKHNfaCtzKTsKKwkgICAgczIgID0gc19oKnNfaDsKKwkgICAgdF9oID0gKGZsb2F0KTMuMCtzMityOworCSAgICBHRVRfRkxPQVRfV09SRChpcyx0X2gpOworCSAgICBTRVRfRkxPQVRfV09SRCh0X2gsaXMmMHhmZmZmZjAwMCk7CisJICAgIHRfbCA9IHItKCh0X2gtKGZsb2F0KTMuMCktczIpOworCS8qIHUrdiA9IHMqKDErLi4uKSAqLworCSAgICB1ID0gc19oKnRfaDsKKwkgICAgdiA9IHNfbCp0X2grdF9sKnM7CisJLyogMi8oM2xvZzIpKihzKy4uLikgKi8KKwkgICAgcF9oID0gdSt2OworCSAgICBHRVRfRkxPQVRfV09SRChpcyxwX2gpOworCSAgICBTRVRfRkxPQVRfV09SRChwX2gsaXMmMHhmZmZmZjAwMCk7CisJICAgIHBfbCA9IHYtKHBfaC11KTsKKwkgICAgel9oID0gY3BfaCpwX2g7CQkvKiBjcF9oK2NwX2wgPSAyLygzKmxvZzIpICovCisJICAgIHpfbCA9IGNwX2wqcF9oK3BfbCpjcCtkcF9sW2tdOworCS8qIGxvZzIoYXgpID0gKHMrLi4pKjIvKDMqbG9nMikgPSBuICsgZHBfaCArIHpfaCArIHpfbCAqLworCSAgICB0ID0gKGZsb2F0KW47CisJICAgIHQxID0gKCgoel9oK3pfbCkrZHBfaFtrXSkrdCk7CisJICAgIEdFVF9GTE9BVF9XT1JEKGlzLHQxKTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQodDEsaXMmMHhmZmZmZjAwMCk7CisJICAgIHQyID0gel9sLSgoKHQxLXQpLWRwX2hba10pLXpfaCk7CisJfQorCisgICAgLyogc3BsaXQgdXAgeSBpbnRvIHkxK3kyIGFuZCBjb21wdXRlICh5MSt5MikqKHQxK3QyKSAqLworCUdFVF9GTE9BVF9XT1JEKGlzLHkpOworCVNFVF9GTE9BVF9XT1JEKHkxLGlzJjB4ZmZmZmYwMDApOworCXBfbCA9ICh5LXkxKSp0MSt5KnQyOworCXBfaCA9IHkxKnQxOworCXogPSBwX2wrcF9oOworCUdFVF9GTE9BVF9XT1JEKGoseik7CisJaWYgKGo+MHg0MzAwMDAwMCkJCQkJLyogaWYgeiA+IDEyOCAqLworCSAgICByZXR1cm4gc24qaHVnZSpodWdlOwkJCS8qIG92ZXJmbG93ICovCisJZWxzZSBpZiAoaj09MHg0MzAwMDAwMCkgewkJCS8qIGlmIHogPT0gMTI4ICovCisJICAgIGlmKHBfbCtvdnQ+ei1wX2gpIHJldHVybiBzbipodWdlKmh1Z2U7CS8qIG92ZXJmbG93ICovCisJfQorCWVsc2UgaWYgKChqJjB4N2ZmZmZmZmYpPjB4NDMxNjAwMDApCQkvKiB6IDw9IC0xNTAgKi8KKwkgICAgcmV0dXJuIHNuKnRpbnkqdGlueTsJCQkvKiB1bmRlcmZsb3cgKi8KKwllbHNlIGlmIChqPT0weGMzMTYwMDAwKXsJCQkvKiB6ID09IC0xNTAgKi8KKwkgICAgaWYocF9sPD16LXBfaCkgcmV0dXJuIHNuKnRpbnkqdGlueTsJCS8qIHVuZGVyZmxvdyAqLworCX0KKyAgICAvKgorICAgICAqIGNvbXB1dGUgMioqKHBfaCtwX2wpCisgICAgICovCisJaSA9IGomMHg3ZmZmZmZmZjsKKwlrID0gKGk+PjIzKS0weDdmOworCW4gPSAwOworCWlmKGk+MHgzZjAwMDAwMCkgewkJLyogaWYgfHp8ID4gMC41LCBzZXQgbiA9IFt6KzAuNV0gKi8KKwkgICAgbiA9IGorKDB4MDA4MDAwMDA+PihrKzEpKTsKKwkgICAgayA9ICgobiYweDdmZmZmZmZmKT4+MjMpLTB4N2Y7CS8qIG5ldyBrIGZvciBuICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHQsbiZ+KDB4MDA3ZmZmZmY+PmspKTsKKwkgICAgbiA9ICgobiYweDAwN2ZmZmZmKXwweDAwODAwMDAwKT4+KDIzLWspOworCSAgICBpZihqPDApIG4gPSAtbjsKKwkgICAgcF9oIC09IHQ7CisJfQorCXQgPSBwX2wrcF9oOworCUdFVF9GTE9BVF9XT1JEKGlzLHQpOworCVNFVF9GTE9BVF9XT1JEKHQsaXMmMHhmZmZmODAwMCk7CisJdSA9IHQqbGcyX2g7CisJdiA9IChwX2wtKHQtcF9oKSkqbGcyK3QqbGcyX2w7CisJeiA9IHUrdjsKKwl3ID0gdi0oei11KTsKKwl0ICA9IHoqejsKKwl0MSAgPSB6IC0gdCooUDErdCooUDIrdCooUDMrdCooUDQrdCpQNSkpKSk7CisJciAgPSAoeip0MSkvKHQxLXR3byktKHcreip3KTsKKwl6ICA9IG9uZS0oci16KTsKKwlHRVRfRkxPQVRfV09SRChqLHopOworCWogKz0gKG48PDIzKTsKKwlpZigoaj4+MjMpPD0wKSB6ID0gc2NhbGJuZih6LG4pOwkvKiBzdWJub3JtYWwgb3V0cHV0ICovCisJZWxzZSBTRVRfRkxPQVRfV09SRCh6LGopOworCXJldHVybiBzbip6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1fcGlvMi5jIGIvbGlibS9zcmMvZV9yZW1fcGlvMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbV9waW8yLmMKQEAgLTAsMCArMSwxNjggQEAKKworLyogQCgjKWVfcmVtX3BpbzIuYyAxLjQgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2VfcmVtX3BpbzIuYyx2IDEuOCAyMDA1LzAyLzA0IDE4OjI2OjA2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3JlbV9waW8yKHgseSkKKyAqIAorICogcmV0dXJuIHRoZSByZW1haW5kZXIgb2YgeCByZW0gcGkvMiBpbiB5WzBdK3lbMV0gCisgKiB1c2UgX19rZXJuZWxfcmVtX3BpbzIoKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qCisgKiBUYWJsZSBvZiBjb25zdGFudHMgZm9yIDIvcGksIDM5NiBIZXggZGlnaXRzICg0NzYgZGVjaW1hbCkgb2YgMi9waSAKKyAqLworc3RhdGljIGNvbnN0IGludDMyX3QgdHdvX292ZXJfcGlbXSA9IHsKKzB4QTJGOTgzLCAweDZFNEU0NCwgMHgxNTI5RkMsIDB4Mjc1N0QxLCAweEY1MzRERCwgMHhDMERCNjIsIAorMHg5NTk5M0MsIDB4NDM5MDQxLCAweEZFNTE2MywgMHhBQkRFQkIsIDB4QzU2MUI3LCAweDI0NkUzQSwgCisweDQyNEREMiwgMHhFMDA2NDksIDB4MkVFQTA5LCAweEQxOTIxQywgMHhGRTFERUIsIDB4MUNCMTI5LCAKKzB4QTczRUU4LCAweDgyMzVGNSwgMHgyRUJCNDQsIDB4ODRFOTlDLCAweDcwMjZCNCwgMHg1RjdFNDEsIAorMHgzOTkxRDYsIDB4Mzk4MzUzLCAweDM5RjQ5QywgMHg4NDVGOEIsIDB4QkRGOTI4LCAweDNCMUZGOCwgCisweDk3RkZERSwgMHgwNTk4MEYsIDB4RUYyRjExLCAweDhCNUEwQSwgMHg2RDFGNkQsIDB4MzY3RUNGLCAKKzB4MjdDQjA5LCAweEI3NEY0NiwgMHgzRjY2OUUsIDB4NUZFQTJELCAweDc1MjdCQSwgMHhDN0VCRTUsIAorMHhGMTdCM0QsIDB4MDczOUY3LCAweDhBNTI5MiwgMHhFQTZCRkIsIDB4NUZCMTFGLCAweDhENUQwOCwgCisweDU2MDMzMCwgMHg0NkZDN0IsIDB4NkJBQkYwLCAweENGQkMyMCwgMHg5QUY0MzYsIDB4MURBOUUzLCAKKzB4OTE2MTVFLCAweEU2MUIwOCwgMHg2NTk5ODUsIDB4NUYxNEEwLCAweDY4NDA4RCwgMHhGRkQ4ODAsIAorMHg0RDczMjcsIDB4MzEwNjA2LCAweDE1NTZDQSwgMHg3M0E4QzksIDB4NjBFMjdCLCAweEMwOEM2QiwgCit9OworCitzdGF0aWMgY29uc3QgaW50MzJfdCBucGlvMl9od1tdID0geworMHgzRkY5MjFGQiwgMHg0MDA5MjFGQiwgMHg0MDEyRDk3QywgMHg0MDE5MjFGQiwgMHg0MDFGNkE3QSwgMHg0MDIyRDk3QywKKzB4NDAyNUZEQkIsIDB4NDAyOTIxRkIsIDB4NDAyQzQ2M0EsIDB4NDAyRjZBN0EsIDB4NDAzMTQ3NUMsIDB4NDAzMkQ5N0MsCisweDQwMzQ2QjlDLCAweDQwMzVGREJCLCAweDQwMzc4RkRCLCAweDQwMzkyMUZCLCAweDQwM0FCNDFCLCAweDQwM0M0NjNBLAorMHg0MDNERDg1QSwgMHg0MDNGNkE3QSwgMHg0MDQwN0U0QywgMHg0MDQxNDc1QywgMHg0MDQyMTA2QywgMHg0MDQyRDk3QywKKzB4NDA0M0EyOEMsIDB4NDA0NDZCOUMsIDB4NDA0NTM0QUMsIDB4NDA0NUZEQkIsIDB4NDA0NkM2Q0IsIDB4NDA0NzhGREIsCisweDQwNDg1OEVCLCAweDQwNDkyMUZCLAorfTsKKworLyoKKyAqIGludnBpbzI6ICA1MyBiaXRzIG9mIDIvcGkKKyAqIHBpbzJfMTogICBmaXJzdCAgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfMXQ6ICBwaS8yIC0gcGlvMl8xCisgKiBwaW8yXzI6ICAgc2Vjb25kIDMzIGJpdCBvZiBwaS8yCisgKiBwaW8yXzJ0OiAgcGkvMiAtIChwaW8yXzErcGlvMl8yKQorICogcGlvMl8zOiAgIHRoaXJkICAzMyBiaXQgb2YgcGkvMgorICogcGlvMl8zdDogIHBpLzIgLSAocGlvMl8xK3BpbzJfMitwaW8yXzMpCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQoremVybyA9ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworaGFsZiA9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvMjQgPSAgMS42Nzc3MjE2MDAwMDAwMDAwMDAwMGUrMDcsIC8qIDB4NDE3MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2ludnBpbzIgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KK3BpbzJfMSAgPSAgMS41NzA3OTYzMjY3MzQxMjU2MTQxN2UrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0MDAwMDAgKi8KK3BpbzJfMXQgPSAgNi4wNzcxMDA1MDY1MDYxOTIyNDkzMmUtMTEsIC8qIDB4M0REMEI0NjEsIDB4MUE2MjYzMzEgKi8KK3BpbzJfMiAgPSAgNi4wNzcxMDA1MDYzMDM5NjU5NzY2MGUtMTEsIC8qIDB4M0REMEI0NjEsIDB4MUE2MDAwMDAgKi8KK3BpbzJfMnQgPSAgMi4wMjIyNjYyNDg3OTU5NTA2MzE1NGUtMjEsIC8qIDB4M0JBMzE5OEEsIDB4MkUwMzcwNzMgKi8KK3BpbzJfMyAgPSAgMi4wMjIyNjYyNDg3MTExNjY0NTU4MGUtMjEsIC8qIDB4M0JBMzE5OEEsIDB4MkUwMDAwMDAgKi8KK3BpbzJfM3QgPSAgOC40Nzg0Mjc2NjAzNjg4OTk1Njk5N2UtMzI7IC8qIDB4Mzk3QjgzOUEsIDB4MjUyMDQ5QzEgKi8KKworCWludDMyX3QgX19pZWVlNzU0X3JlbV9waW8yKGRvdWJsZSB4LCBkb3VibGUgKnkpCit7CisJZG91YmxlIHosdyx0LHIsZm47CisJZG91YmxlIHR4WzNdOworCWludDMyX3QgZTAsaSxqLG54LG4saXgsaHg7CisJdV9pbnQzMl90IGxvdzsKKworCUdFVF9ISUdIX1dPUkQoaHgseCk7CQkvKiBoaWdoIHdvcmQgb2YgeCAqLworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeDw9MHgzZmU5MjFmYikgICAvKiB8eHwgfjw9IHBpLzQgLCBubyBuZWVkIGZvciByZWR1Y3Rpb24gKi8KKwkgICAge3lbMF0gPSB4OyB5WzFdID0gMDsgcmV0dXJuIDA7fQorCWlmKGl4PDB4NDAwMmQ5N2MpIHsgIC8qIHx4fCA8IDNwaS80LCBzcGVjaWFsIGNhc2Ugd2l0aCBuPSstMSAqLworCSAgICBpZihoeD4wKSB7IAorCQl6ID0geCAtIHBpbzJfMTsKKwkJaWYoaXghPTB4M2ZmOTIxZmIpIHsgCS8qIDMzKzUzIGJpdCBwaSBpcyBnb29kIGVub3VnaCAqLworCQkgICAgeVswXSA9IHogLSBwaW8yXzF0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pLXBpbzJfMXQ7CisJCX0gZWxzZSB7CQkvKiBuZWFyIHBpLzIsIHVzZSAzMyszMys1MyBiaXQgcGkgKi8KKwkJICAgIHogLT0gcGlvMl8yOworCQkgICAgeVswXSA9IHogLSBwaW8yXzJ0OworCQkgICAgeVsxXSA9ICh6LXlbMF0pLXBpbzJfMnQ7CisJCX0KKwkJcmV0dXJuIDE7CisJICAgIH0gZWxzZSB7CS8qIG5lZ2F0aXZlIHggKi8KKwkJeiA9IHggKyBwaW8yXzE7CisJCWlmKGl4IT0weDNmZjkyMWZiKSB7IAkvKiAzMys1MyBiaXQgcGkgaXMgZ29vZCBlbm91Z2ggKi8KKwkJICAgIHlbMF0gPSB6ICsgcGlvMl8xdDsKKwkJICAgIHlbMV0gPSAoei15WzBdKStwaW8yXzF0OworCQl9IGVsc2UgewkJLyogbmVhciBwaS8yLCB1c2UgMzMrMzMrNTMgYml0IHBpICovCisJCSAgICB6ICs9IHBpbzJfMjsKKwkJICAgIHlbMF0gPSB6ICsgcGlvMl8ydDsKKwkJICAgIHlbMV0gPSAoei15WzBdKStwaW8yXzJ0OworCQl9CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKwlpZihpeDw9MHg0MTM5MjFmYikgeyAvKiB8eHwgfjw9IDJeMTkqKHBpLzIpLCBtZWRpdW0gc2l6ZSAqLworCSAgICB0ICA9IGZhYnMoeCk7CisJICAgIG4gID0gKGludDMyX3QpICh0KmludnBpbzIraGFsZik7CisJICAgIGZuID0gKGRvdWJsZSluOworCSAgICByICA9IHQtZm4qcGlvMl8xOworCSAgICB3ICA9IGZuKnBpbzJfMXQ7CS8qIDFzdCByb3VuZCBnb29kIHRvIDg1IGJpdCAqLworCSAgICBpZihuPDMyJiZpeCE9bnBpbzJfaHdbbi0xXSkgewkKKwkJeVswXSA9IHItdzsJLyogcXVpY2sgY2hlY2sgbm8gY2FuY2VsbGF0aW9uICovCisJICAgIH0gZWxzZSB7CisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgICAgIGogID0gaXg+PjIwOworCSAgICAgICAgeVswXSA9IHItdzsgCisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5WzBdKTsKKwkgICAgICAgIGkgPSBqLSgoaGlnaD4+MjApJjB4N2ZmKTsKKwkgICAgICAgIGlmKGk+MTYpIHsgIC8qIDJuZCBpdGVyYXRpb24gbmVlZGVkLCBnb29kIHRvIDExOCAqLworCQkgICAgdCAgPSByOworCQkgICAgdyAgPSBmbipwaW8yXzI7CQorCQkgICAgciAgPSB0LXc7CisJCSAgICB3ICA9IGZuKnBpbzJfMnQtKCh0LXIpLXcpOwkKKwkJICAgIHlbMF0gPSByLXc7CisJCSAgICBHRVRfSElHSF9XT1JEKGhpZ2gseVswXSk7CisJCSAgICBpID0gai0oKGhpZ2g+PjIwKSYweDdmZik7CisJCSAgICBpZihpPjQ5KSAgewkvKiAzcmQgaXRlcmF0aW9uIG5lZWQsIDE1MSBiaXRzIGFjYyAqLworCQkgICAgCXQgID0gcjsJLyogd2lsbCBjb3ZlciBhbGwgcG9zc2libGUgY2FzZXMgKi8KKwkJICAgIAl3ICA9IGZuKnBpbzJfMzsJCisJCSAgICAJciAgPSB0LXc7CisJCSAgICAJdyAgPSBmbipwaW8yXzN0LSgodC1yKS13KTsJCisJCSAgICAJeVswXSA9IHItdzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIHlbMV0gPSAoci15WzBdKS13OworCSAgICBpZihoeDwwKSAJe3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCSAgICBlbHNlCSByZXR1cm4gbjsKKwl9CisgICAgLyogCisgICAgICogYWxsIG90aGVyIChsYXJnZSkgYXJndW1lbnRzCisgICAgICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHsJCS8qIHggaXMgaW5mIG9yIE5hTiAqLworCSAgICB5WzBdPXlbMV09eC14OyByZXR1cm4gMDsKKwl9CisgICAgLyogc2V0IHogPSBzY2FsYm4ofHh8LGlsb2diKHgpLTIzKSAqLworCUdFVF9MT1dfV09SRChsb3cseCk7CisJU0VUX0xPV19XT1JEKHosbG93KTsKKwllMCAJPSAoaXg+PjIwKS0xMDQ2OwkvKiBlMCA9IGlsb2diKHopLTIzOyAqLworCVNFVF9ISUdIX1dPUkQoeiwgaXggLSAoKGludDMyX3QpKGUwPDwyMCkpKTsKKwlmb3IoaT0wO2k8MjtpKyspIHsKKwkJdHhbaV0gPSAoZG91YmxlKSgoaW50MzJfdCkoeikpOworCQl6ICAgICA9ICh6LXR4W2ldKSp0d28yNDsKKwl9CisJdHhbMl0gPSB6OworCW54ID0gMzsKKwl3aGlsZSh0eFtueC0xXT09emVybykgbngtLTsJLyogc2tpcCB6ZXJvIHRlcm0gKi8KKwluICA9ICBfX2tlcm5lbF9yZW1fcGlvMih0eCx5LGUwLG54LDIsdHdvX292ZXJfcGkpOworCWlmKGh4PDApIHt5WzBdID0gLXlbMF07IHlbMV0gPSAteVsxXTsgcmV0dXJuIC1uO30KKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2VfcmVtX3BpbzJmLmMgYi9saWJtL3NyYy9lX3JlbV9waW8yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzFjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9lX3JlbV9waW8yZi5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIGVfcmVtX3BpbzJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3JlbV9waW8yLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogRGVidWdnZWQgYW5kIG9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9lX3JlbV9waW8yZi5jLHYgMS4xOSAyMDA1LzExLzIzIDAzOjAzOjA5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogX19pZWVlNzU0X3JlbV9waW8yZih4LHkpCisgKgorICogcmV0dXJuIHRoZSByZW1haW5kZXIgb2YgeCByZW0gcGkvMiBpbiB5WzBdK3lbMV0KKyAqIHVzZSBkb3VibGUgcHJlY2lzaW9uIGludGVybmFsbHkKKyAqIHVzZSBfX2tlcm5lbF9yZW1fcGlvMigpIGZvciBsYXJnZSB4CisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyoKKyAqIFRhYmxlIG9mIGNvbnN0YW50cyBmb3IgMi9waSwgMzk2IEhleCBkaWdpdHMgKDQ3NiBkZWNpbWFsKSBvZiAyL3BpCisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IHR3b19vdmVyX3BpW10gPSB7CisweEEyRjk4MywgMHg2RTRFNDQsIDB4MTUyOUZDLCAweDI3NTdEMSwgMHhGNTM0REQsIDB4QzBEQjYyLCAKKzB4OTU5OTNDLCAweDQzOTA0MSwgMHhGRTUxNjMsIDB4QUJERUJCLCAweEM1NjFCNywgMHgyNDZFM0EsIAorMHg0MjRERDIsIDB4RTAwNjQ5LCAweDJFRUEwOSwgMHhEMTkyMUMsIDB4RkUxREVCLCAweDFDQjEyOSwgCisweEE3M0VFOCwgMHg4MjM1RjUsIDB4MkVCQjQ0LCAweDg0RTk5QywgMHg3MDI2QjQsIDB4NUY3RTQxLCAKKzB4Mzk5MUQ2LCAweDM5ODM1MywgMHgzOUY0OUMsIDB4ODQ1RjhCLCAweEJERjkyOCwgMHgzQjFGRjgsIAorMHg5N0ZGREUsIDB4MDU5ODBGLCAweEVGMkYxMSwgMHg4QjVBMEEsIDB4NkQxRjZELCAweDM2N0VDRiwgCisweDI3Q0IwOSwgMHhCNzRGNDYsIDB4M0Y2NjlFLCAweDVGRUEyRCwgMHg3NTI3QkEsIDB4QzdFQkU1LCAKKzB4RjE3QjNELCAweDA3MzlGNywgMHg4QTUyOTIsIDB4RUE2QkZCLCAweDVGQjExRiwgMHg4RDVEMDgsIAorMHg1NjAzMzAsIDB4NDZGQzdCLCAweDZCQUJGMCwgMHhDRkJDMjAsIDB4OUFGNDM2LCAweDFEQTlFMywgCisweDkxNjE1RSwgMHhFNjFCMDgsIDB4NjU5OTg1LCAweDVGMTRBMCwgMHg2ODQwOEQsIDB4RkZEODgwLCAKKzB4NEQ3MzI3LCAweDMxMDYwNiwgMHgxNTU2Q0EsIDB4NzNBOEM5LCAweDYwRTI3QiwgMHhDMDhDNkIsIAorfTsKKworLyoKKyAqIGludnBpbzI6ICA1MyBiaXRzIG9mIDIvcGkKKyAqIHBpbzJfMTogICBmaXJzdCAgMzMgYml0IG9mIHBpLzIKKyAqIHBpbzJfMXQ6ICBwaS8yIC0gcGlvMl8xCisgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQoremVybyA9ICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCAqLworaGFsZiA9ICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwZS0wMSwgLyogMHgzRkUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvMjQgPSAgMS42Nzc3MjE2MDAwMDAwMDAwMDAwMGUrMDcsIC8qIDB4NDE3MDAwMDAsIDB4MDAwMDAwMDAgKi8KK2ludnBpbzIgPSAgNi4zNjYxOTc3MjM2NzU4MTM4MjQzM2UtMDEsIC8qIDB4M0ZFNDVGMzAsIDB4NkRDOUM4ODMgKi8KK3BpbzJfMSAgPSAgMS41NzA3OTYzMjY3MzQxMjU2MTQxN2UrMDAsIC8qIDB4M0ZGOTIxRkIsIDB4NTQ0MDAwMDAgKi8KK3BpbzJfMXQgPSAgNi4wNzcxMDA1MDY1MDYxOTIyNDkzMmUtMTE7IC8qIDB4M0REMEI0NjEsIDB4MUE2MjYzMzEgKi8KKworCWludDMyX3QgX19pZWVlNzU0X3JlbV9waW8yZihmbG9hdCB4LCBmbG9hdCAqeSkKK3sKKwlkb3VibGUgdyx0LHIsZm47CisJZG91YmxlIHR4WzFdLHR5WzJdOworCWZsb2F0IHo7CisJaW50MzJfdCBlMCxuLGl4LGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworICAgIC8qIDMzKzUzIGJpdCBwaSBpcyBnb29kIGVub3VnaCBmb3IgbWVkaXVtIHNpemUgKi8KKwlpZihpeDw9MHg0OTQ5MGY4MCkgewkJLyogfHh8IH48PSAyXjE5KihwaS8yKSwgbWVkaXVtIHNpemUgKi8KKwkgICAgdCAgPSBmYWJzZih4KTsKKwkgICAgbiAgPSAoaW50MzJfdCkgKHQqaW52cGlvMitoYWxmKTsKKwkgICAgZm4gPSAoZG91YmxlKW47CisJICAgIHIgID0gdC1mbipwaW8yXzE7CisJICAgIHcgID0gZm4qcGlvMl8xdDsKKwkgICAgeVswXSA9IHItdzsKKwkgICAgeVsxXSA9IChyLXlbMF0pLXc7CisJICAgIGlmKGh4PDApIAl7eVswXSA9IC15WzBdOyB5WzFdID0gLXlbMV07IHJldHVybiAtbjt9CisJICAgIGVsc2UJIHJldHVybiBuOworCX0KKyAgICAvKgorICAgICAqIGFsbCBvdGhlciAobGFyZ2UpIGFyZ3VtZW50cworICAgICAqLworCWlmKGl4Pj0weDdmODAwMDAwKSB7CQkvKiB4IGlzIGluZiBvciBOYU4gKi8KKwkgICAgeVswXT15WzFdPXgteDsgcmV0dXJuIDA7CisJfQorICAgIC8qIHNldCB6ID0gc2NhbGJuKHx4fCxpbG9nYih8eHwpLTIzKSAqLworCWUwID0gKGl4Pj4yMyktMTUwOwkJLyogZTAgPSBpbG9nYih8eHwpLTIzOyAqLworCVNFVF9GTE9BVF9XT1JEKHosIGl4IC0gKChpbnQzMl90KShlMDw8MjMpKSk7CisJdHhbMF0gPSB6OworCW4gID0gIF9fa2VybmVsX3JlbV9waW8yKHR4LHR5LGUwLDEsMSx0d29fb3Zlcl9waSk7CisJeVswXSA9IHR5WzBdOworCXlbMV0gPSB0eVswXSAtIHlbMF07CisJaWYoaHg8MCkge3lbMF0gPSAteVswXTsgeVsxXSA9IC15WzFdOyByZXR1cm4gLW47fQorCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1haW5kZXIuYyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MzJhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2VfcmVtYWluZGVyLmMKQEAgLTAsMCArMSw3MyBAQAorCisvKiBAKCMpZV9yZW1haW5kZXIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1haW5kZXIuYyx2IDEuMTAgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIF9faWVlZTc1NF9yZW1haW5kZXIoeCxwKQorICogUmV0dXJuIDogICAgICAgICAgICAgICAgICAKKyAqIAlyZXR1cm5zICB4IFJFTSBwICA9ICB4IC0gW3gvcF0qcCBhcyBpZiBpbiBpbmZpbml0ZSAKKyAqIAlwcmVjaXNlIGFyaXRobWV0aWMsIHdoZXJlIFt4L3BdIGlzIHRoZSAoaW5maW5pdGUgYml0KSAKKyAqCWludGVnZXIgbmVhcmVzdCB4L3AgKGluIGhhbGYgd2F5IGNhc2UgY2hvb3NlIHRoZSBldmVuIG9uZSkuCisgKiBNZXRob2QgOiAKKyAqCUJhc2VkIG9uIGZtb2QoKSByZXR1cm4geC1beC9wXWNob3BwZWQqcCBleGFjdGxwLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuMDsKKworCitkb3VibGUKK19faWVlZTc1NF9yZW1haW5kZXIoZG91YmxlIHgsIGRvdWJsZSBwKQoreworCWludDMyX3QgaHgsaHA7CisJdV9pbnQzMl90IHN4LGx4LGxwOworCWRvdWJsZSBwX2hhbGY7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHAsbHAscCk7CisJc3ggPSBoeCYweDgwMDAwMDAwOworCWhwICY9IDB4N2ZmZmZmZmY7CisJaHggJj0gMHg3ZmZmZmZmZjsKKworICAgIC8qIHB1cmdlIG9mZiBleGNlcHRpb24gdmFsdWVzICovCisJaWYoKGhwfGxwKT09MCkgcmV0dXJuICh4KnApLyh4KnApOyAJLyogcCA9IDAgKi8KKwlpZigoaHg+PTB4N2ZmMDAwMDApfHwJCQkvKiB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHA+PTB4N2ZmMDAwMDApJiYJCQkvKiBwIGlzIE5hTiAqLworCSAgKCgoaHAtMHg3ZmYwMDAwMCl8bHApIT0wKSkpCisJICAgIHJldHVybiAoeCpwKS8oeCpwKTsKKworCisJaWYgKGhwPD0weDdmZGZmZmZmKSB4ID0gX19pZWVlNzU0X2Ztb2QoeCxwK3ApOwkvKiBub3cgeCA8IDJwICovCisJaWYgKCgoaHgtaHApfChseC1scCkpPT0wKSByZXR1cm4gemVybyp4OworCXggID0gZmFicyh4KTsKKwlwICA9IGZhYnMocCk7CisJaWYgKGhwPDB4MDAyMDAwMDApIHsKKwkgICAgaWYoeCt4PnApIHsKKwkJeC09cDsKKwkJaWYoeCt4Pj1wKSB4IC09IHA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwX2hhbGYgPSAwLjUqcDsKKwkgICAgaWYoeD5wX2hhbGYpIHsKKwkJeC09cDsKKwkJaWYoeD49cF9oYWxmKSB4IC09IHA7CisJICAgIH0KKwl9CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlTRVRfSElHSF9XT1JEKHgsaHhec3gpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9yZW1haW5kZXJmLmMgYi9saWJtL3NyYy9lX3JlbWFpbmRlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ1MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9yZW1haW5kZXJmLmMKQEAgLTAsMCArMSw2NSBAQAorLyogZV9yZW1haW5kZXJmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3JlbWFpbmRlci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9yZW1haW5kZXJmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCB6ZXJvID0gMC4wOworCisKK2Zsb2F0CitfX2llZWU3NTRfcmVtYWluZGVyZihmbG9hdCB4LCBmbG9hdCBwKQoreworCWludDMyX3QgaHgsaHA7CisJdV9pbnQzMl90IHN4OworCWZsb2F0IHBfaGFsZjsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCUdFVF9GTE9BVF9XT1JEKGhwLHApOworCXN4ID0gaHgmMHg4MDAwMDAwMDsKKwlocCAmPSAweDdmZmZmZmZmOworCWh4ICY9IDB4N2ZmZmZmZmY7CisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGhwPT0wKSByZXR1cm4gKHgqcCkvKHgqcCk7CSAJLyogcCA9IDAgKi8KKwlpZigoaHg+PTB4N2Y4MDAwMDApfHwJCQkvKiB4IG5vdCBmaW5pdGUgKi8KKwkgICgoaHA+MHg3ZjgwMDAwMCkpKQkJCS8qIHAgaXMgTmFOICovCisJICAgIHJldHVybiAoeCpwKS8oeCpwKTsKKworCisJaWYgKGhwPD0weDdlZmZmZmZmKSB4ID0gX19pZWVlNzU0X2Ztb2RmKHgscCtwKTsJLyogbm93IHggPCAycCAqLworCWlmICgoaHgtaHApPT0wKSByZXR1cm4gemVybyp4OworCXggID0gZmFic2YoeCk7CisJcCAgPSBmYWJzZihwKTsKKwlpZiAoaHA8MHgwMTAwMDAwMCkgeworCSAgICBpZih4K3g+cCkgeworCQl4LT1wOworCQlpZih4K3g+PXApIHggLT0gcDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHBfaGFsZiA9IChmbG9hdCkwLjUqcDsKKwkgICAgaWYoeD5wX2hhbGYpIHsKKwkJeC09cDsKKwkJaWYoeD49cF9oYWxmKSB4IC09IHA7CisJICAgIH0KKwl9CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeCxoeF5zeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NjYWxiLmMgYi9saWJtL3NyYy9lX3NjYWxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxNjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc2NhbGIuYwpAQCAtMCwwICsxLDQ4IEBACisKKy8qIEAoIyllX3NjYWxiLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2NhbGIuYyx2IDEuMTIgMjAwNS8wMi8wNCAxODoyNjowNiBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBfX2llZWU3NTRfc2NhbGIoeCwgZm4pIGlzIHByb3ZpZGUgZm9yCisgKiBwYXNzaW5nIHZhcmlvdXMgc3RhbmRhcmQgdGVzdCBzdWl0ZS4gT25lIAorICogc2hvdWxkIHVzZSBzY2FsYm4oKSBpbnN0ZWFkLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZmRlZiBfU0NBTEJfSU5UCitkb3VibGUKK19faWVlZTc1NF9zY2FsYihkb3VibGUgeCwgaW50IGZuKQorI2Vsc2UKK2RvdWJsZQorX19pZWVlNzU0X3NjYWxiKGRvdWJsZSB4LCBkb3VibGUgZm4pCisjZW5kaWYKK3sKKyNpZmRlZiBfU0NBTEJfSU5UCisJcmV0dXJuIHNjYWxibih4LGZuKTsKKyNlbHNlCisJaWYgKGlzbmFuKHgpfHxpc25hbihmbikpIHJldHVybiB4KmZuOworCWlmICghZmluaXRlKGZuKSkgeworCSAgICBpZihmbj4wLjApIHJldHVybiB4KmZuOworCSAgICBlbHNlICAgICAgIHJldHVybiB4LygtZm4pOworCX0KKwlpZiAocmludChmbikhPWZuKSByZXR1cm4gKGZuLWZuKS8oZm4tZm4pOworCWlmICggZm4gPiA2NTAwMC4wKSByZXR1cm4gc2NhbGJuKHgsIDY1MDAwKTsKKwlpZiAoLWZuID4gNjUwMDAuMCkgcmV0dXJuIHNjYWxibih4LC02NTAwMCk7CisJcmV0dXJuIHNjYWxibih4LChpbnQpZm4pOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NjYWxiZi5jIGIvbGlibS9zcmMvZV9zY2FsYmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FjMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zY2FsYmYuYwpAQCAtMCwwICsxLDQ2IEBACisvKiBlX3NjYWxiZi5jIC0tIGZsb2F0IHZlcnNpb24gb2YgZV9zY2FsYi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zY2FsYmYuYyx2IDEuMTAgMjAwNS8xMi8wNiAyMDoxMjozOCBvYnJpZW4gRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKyNpZmRlZiBfU0NBTEJfSU5UCitmbG9hdAorX19pZWVlNzU0X3NjYWxiZihmbG9hdCB4LCBpbnQgZm4pCisjZWxzZQorZmxvYXQKK19faWVlZTc1NF9zY2FsYmYoZmxvYXQgeCwgZmxvYXQgZm4pCisjZW5kaWYKK3sKKyNpZmRlZiBfU0NBTEJfSU5UCisJcmV0dXJuIHNjYWxibmYoeCxmbik7CisjZWxzZQorCWlmICgoaXNuYW5mKSh4KXx8KGlzbmFuZikoZm4pKSByZXR1cm4geCpmbjsKKwlpZiAoIWZpbml0ZWYoZm4pKSB7CisJICAgIGlmKGZuPihmbG9hdCkwLjApIHJldHVybiB4KmZuOworCSAgICBlbHNlICAgICAgIHJldHVybiB4LygtZm4pOworCX0KKwlpZiAocmludGYoZm4pIT1mbikgcmV0dXJuIChmbi1mbikvKGZuLWZuKTsKKwlpZiAoIGZuID4gKGZsb2F0KTY1MDAwLjApIHJldHVybiBzY2FsYm5mKHgsIDY1MDAwKTsKKwlpZiAoLWZuID4gKGZsb2F0KTY1MDAwLjApIHJldHVybiBzY2FsYm5mKHgsLTY1MDAwKTsKKwlyZXR1cm4gc2NhbGJuZih4LChpbnQpZm4pOworI2VuZGlmCit9CisKK19fd2Vha19yZWZlcmVuY2Uoc2NhbGJmLCBsZGV4cGYpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvZV9zaW5oLmMgYi9saWJtL3NyYy9lX3NpbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg0YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zaW5oLmMKQEAgLTAsMCArMSw3OSBAQAorCisvKiBAKCMpZV9zaW5oLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc2luaC5jLHYgMS45IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfc2luaCh4KQorICogTWV0aG9kIDogCisgKiBtYXRoZW1hdGljYWxseSBzaW5oKHgpIGlmIGRlZmluZWQgdG8gYmUgKGV4cCh4KS1leHAoLXgpKS8yCisgKgkxLiBSZXBsYWNlIHggYnkgfHh8IChzaW5oKC14KSA9IC1zaW5oKHgpKS4gCisgKgkyLiAKKyAqCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFICsgRS8oRSsxKQorICoJICAgIDAgICAgICAgIDw9IHggPD0gMjIgICAgIDogIHNpbmgoeCkgOj0gLS0tLS0tLS0tLS0tLS0sIEU9ZXhwbTEoeCkKKyAqCQkJICAgICAgIAkJCSAgICAgICAgMgorICoKKyAqCSAgICAyMiAgICAgICA8PSB4IDw9IGxub3ZmdCA6ICBzaW5oKHgpIDo9IGV4cCh4KS8yIAorICoJICAgIGxub3ZmdCAgIDw9IHggPD0gbG4yb3ZmdDogIHNpbmgoeCkgOj0gZXhwKHgvMikvMiAqIGV4cCh4LzIpCisgKgkgICAgbG4yb3ZmdCAgPCAgeAkgICAgOiAgc2luaCh4KSA6PSB4KnNodWdlIChvdmVyZmxvdykKKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJc2luaCh4KSBpcyB8eHwgaWYgeCBpcyArSU5GLCAtSU5GLCBvciBOYU4uCisgKglvbmx5IHNpbmgoMCk9MCBpcyBleGFjdCBmb3IgZmluaXRlIHguCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmUgPSAxLjAsIHNodWdlID0gMS4wZTMwNzsKKworZG91YmxlCitfX2llZWU3NTRfc2luaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx3LGg7CisJaW50MzJfdCBpeCxqeDsKKwl1X2ludDMyX3QgbHg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CQorCisJaCA9IDAuNTsKKwlpZiAoang8MCkgaCA9IC1oOworICAgIC8qIHx4fCBpbiBbMCwyMl0sIHJldHVybiBzaWduKHgpKjAuNSooRStFLyhFKzEpKSkgKi8KKwlpZiAoaXggPCAweDQwMzYwMDAwKSB7CQkvKiB8eHw8MjIgKi8KKwkgICAgaWYgKGl4PDB4M2UzMDAwMDApIAkJLyogfHh8PDIqKi0yOCAqLworCQlpZihzaHVnZSt4Pm9uZSkgcmV0dXJuIHg7Lyogc2luaCh0aW55KSA9IHRpbnkgd2l0aCBpbmV4YWN0ICovCisJICAgIHQgPSBleHBtMShmYWJzKHgpKTsKKwkgICAgaWYoaXg8MHgzZmYwMDAwMCkgcmV0dXJuIGgqKDIuMCp0LXQqdC8odCtvbmUpKTsKKwkgICAgcmV0dXJuIGgqKHQrdC8odCtvbmUpKTsKKwl9CisKKyAgICAvKiB8eHwgaW4gWzIyLCBsb2cobWF4ZG91YmxlKV0gcmV0dXJuIDAuNSpleHAofHh8KSAqLworCWlmIChpeCA8IDB4NDA4NjJFNDIpICByZXR1cm4gaCpfX2llZWU3NTRfZXhwKGZhYnMoeCkpOworCisgICAgLyogfHh8IGluIFtsb2cobWF4ZG91YmxlKSwgb3ZlcmZsb3d0aHJlc29sZF0gKi8KKwlHRVRfTE9XX1dPUkQobHgseCk7CisJaWYgKGl4PDB4NDA4NjMzQ0UgfHwgKChpeD09MHg0MDg2MzNjZSkmJihseDw9KHVfaW50MzJfdCkweDhmYjlmODdkKSkpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHAoMC41KmZhYnMoeCkpOworCSAgICB0ID0gaCp3OworCSAgICByZXR1cm4gdCp3OworCX0KKworICAgIC8qIHx4fCA+IG92ZXJmbG93dGhyZXNvbGQsIHNpbmgoeCkgb3ZlcmZsb3cgKi8KKwlyZXR1cm4geCpzaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc2luaGYuYyBiL2xpYm0vc3JjL2Vfc2luaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU3NTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvZV9zaW5oZi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGVfc2luaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGVfc2luaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zaW5oZi5jLHYgMS44IDIwMDUvMTEvMTMgMDA6NDE6NDYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lID0gMS4wLCBzaHVnZSA9IDEuMGUzNzsKKworZmxvYXQKK19faWVlZTc1NF9zaW5oZihmbG9hdCB4KQoreworCWZsb2F0IHQsdyxoOworCWludDMyX3QgaXgsang7CisKKwlHRVRfRkxPQVRfV09SRChqeCx4KTsKKwlpeCA9IGp4JjB4N2ZmZmZmZmY7CisKKyAgICAvKiB4IGlzIElORiBvciBOYU4gKi8KKwlpZihpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKworCWggPSAwLjU7CisJaWYgKGp4PDApIGggPSAtaDsKKyAgICAvKiB8eHwgaW4gWzAsOV0sIHJldHVybiBzaWduKHgpKjAuNSooRStFLyhFKzEpKSkgKi8KKwlpZiAoaXggPCAweDQxMTAwMDAwKSB7CQkvKiB8eHw8OSAqLworCSAgICBpZiAoaXg8MHgzOTgwMDAwMCkgCQkvKiB8eHw8MioqLTEyICovCisJCWlmKHNodWdlK3g+b25lKSByZXR1cm4geDsvKiBzaW5oKHRpbnkpID0gdGlueSB3aXRoIGluZXhhY3QgKi8KKwkgICAgdCA9IGV4cG0xZihmYWJzZih4KSk7CisJICAgIGlmKGl4PDB4M2Y4MDAwMDApIHJldHVybiBoKigoZmxvYXQpMi4wKnQtdCp0Lyh0K29uZSkpOworCSAgICByZXR1cm4gaCoodCt0Lyh0K29uZSkpOworCX0KKworICAgIC8qIHx4fCBpbiBbOSwgbG9nZihtYXhmbG9hdCldIHJldHVybiAwLjUqZXhwKHx4fCkgKi8KKwlpZiAoaXggPCAweDQyYjE3MjE3KSAgcmV0dXJuIGgqX19pZWVlNzU0X2V4cGYoZmFic2YoeCkpOworCisgICAgLyogfHh8IGluIFtsb2dmKG1heGZsb2F0KSwgb3ZlcmZsb3d0aHJlc29sZF0gKi8KKwlpZiAoaXg8PTB4NDJiMmQ0ZmMpIHsKKwkgICAgdyA9IF9faWVlZTc1NF9leHBmKChmbG9hdCkwLjUqZmFic2YoeCkpOworCSAgICB0ID0gaCp3OworCSAgICByZXR1cm4gdCp3OworCX0KKworICAgIC8qIHx4fCA+IG92ZXJmbG93dGhyZXNvbGQsIHNpbmgoeCkgb3ZlcmZsb3cgKi8KKwlyZXR1cm4geCpzaHVnZTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2Vfc3FydC5jIGIvbGlibS9zcmMvZV9zcXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1Y2IxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc3FydC5jCkBAIC0wLDAgKzEsNDQ2IEBACisKKy8qIEAoIyllX3NxcnQuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvZV9zcXJ0LmMsdiAxLjEwIDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2llZWU3NTRfc3FydCh4KQorICogUmV0dXJuIGNvcnJlY3RseSByb3VuZGVkIHNxcnQuCisgKiAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgIHwgIFVzZSB0aGUgaGFyZHdhcmUgc3FydCBpZiB5b3UgaGF2ZSBvbmUgfAorICogICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWV0aG9kOiAKKyAqICAgQml0IGJ5IGJpdCBtZXRob2QgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljLiAoU2xvdywgYnV0IHBvcnRhYmxlKSAKKyAqICAgMS4gTm9ybWFsaXphdGlvbgorICoJU2NhbGUgeCB0byB5IGluIFsxLDQpIHdpdGggZXZlbiBwb3dlcnMgb2YgMjogCisgKglmaW5kIGFuIGludGVnZXIgayBzdWNoIHRoYXQgIDEgPD0gKHk9eCoyXigyaykpIDwgNCwgdGhlbgorICoJCXNxcnQoeCkgPSAyXmsgKiBzcXJ0KHkpCisgKiAgIDIuIEJpdCBieSBiaXQgY29tcHV0YXRpb24KKyAqCUxldCBxICA9IHNxcnQoeSkgdHJ1bmNhdGVkIHRvIGkgYml0IGFmdGVyIGJpbmFyeSBwb2ludCAocSA9IDEpLAorICoJICAgICBpCQkJCQkJCSAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEgICAgICAgICAyCisgKgkgICAgcyAgPSAyKnEgLCBhbmQJeSAgPSAgMiAgICogKCB5IC0gcSAgKS4JCSgxKQorICoJICAgICBpICAgICAgaSAgICAgICAgICAgIGkgICAgICAgICAgICAgICAgIGkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCVRvIGNvbXB1dGUgcSAgICBmcm9tIHEgLCBvbmUgY2hlY2tzIHdoZXRoZXIgCisgKgkJICAgIGkrMSAgICAgICBpICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKgkJCSAgICAgIC0oaSsxKSAyCisgKgkJCShxICsgMiAgICAgICkgPD0geS4JCQkoMikKKyAqICAgICAJCQkgIGkKKyAqCQkJCQkJCSAgICAgIC0oaSsxKQorICoJSWYgKDIpIGlzIGZhbHNlLCB0aGVuIHEgICA9IHEgOyBvdGhlcndpc2UgcSAgID0gcSAgKyAyICAgICAgLgorICoJCSAJICAgICAgIGkrMSAgIGkgICAgICAgICAgICAgaSsxICAgaQorICoKKyAqCVdpdGggc29tZSBhbGdlYnJpYyBtYW5pcHVsYXRpb24sIGl0IGlzIG5vdCBkaWZmaWN1bHQgdG8gc2VlCisgKgl0aGF0ICgyKSBpcyBlcXVpdmFsZW50IHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaSsxKQorICoJCQlzICArICAyICAgICAgIDw9IHkJCQkoMykKKyAqCQkJIGkgICAgICAgICAgICAgICAgaQorICoKKyAqCVRoZSBhZHZhbnRhZ2Ugb2YgKDMpIGlzIHRoYXQgcyAgYW5kIHkgIGNhbiBiZSBjb21wdXRlZCBieSAKKyAqCQkJCSAgICAgIGkgICAgICBpCisgKgl0aGUgZm9sbG93aW5nIHJlY3VycmVuY2UgZm9ybXVsYToKKyAqCSAgICBpZiAoMykgaXMgZmFsc2UKKyAqCisgKgkgICAgcyAgICAgPSAgcyAgLAl5ICAgID0geSAgIDsJCQkoNCkKKyAqCSAgICAgaSsxICAgICAgaQkJIGkrMSAgICBpCisgKgorICoJICAgIG90aGVyd2lzZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC1pICAgICAgICAgICAgICAgICAgICAgLShpKzEpCisgKgkgICAgcwkgID0gIHMgICsgMiAgLCAgeSAgICA9IHkgIC0gIHMgIC0gMiAgCQkoNSkKKyAqICAgICAgICAgICBpKzEgICAgICBpICAgICAgICAgIGkrMSAgICBpICAgICBpCisgKgkJCQkKKyAqCU9uZSBtYXkgZWFzaWx5IHVzZSBpbmR1Y3Rpb24gdG8gcHJvdmUgKDQpIGFuZCAoNSkuIAorICoJTm90ZS4gU2luY2UgdGhlIGxlZnQgaGFuZCBzaWRlIG9mICgzKSBjb250YWluIG9ubHkgaSsyIGJpdHMsCisgKgkgICAgICBpdCBkb2VzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYSBmdWxsICg1My1iaXQpIGNvbXBhcmlzb24gCisgKgkgICAgICBpbiAoMykuCisgKiAgIDMuIEZpbmFsIHJvdW5kaW5nCisgKglBZnRlciBnZW5lcmF0aW5nIHRoZSA1MyBiaXRzIHJlc3VsdCwgd2UgY29tcHV0ZSBvbmUgbW9yZSBiaXQuCisgKglUb2dldGhlciB3aXRoIHRoZSByZW1haW5kZXIsIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0aGUKKyAqCXJlc3VsdCBpcyBleGFjdCwgYmlnZ2VyIHRoYW4gMS8ydWxwLCBvciBsZXNzIHRoYW4gMS8ydWxwCisgKgkoaXQgd2lsbCBuZXZlciBlcXVhbCB0byAxLzJ1bHApLgorICoJVGhlIHJvdW5kaW5nIG1vZGUgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHdoZXRoZXIKKyAqCWh1Z2UgKyB0aW55IGlzIGVxdWFsIHRvIGh1Z2UsIGFuZCB3aGV0aGVyIGh1Z2UgLSB0aW55IGlzCisgKgllcXVhbCB0byBodWdlIGZvciBzb21lIGZsb2F0aW5nIHBvaW50IG51bWJlciAiaHVnZSIgYW5kICJ0aW55Ii4KKyAqCQkKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglzcXJ0KCstMCkgPSArLTAgCS4uLiBleGFjdAorICoJc3FydChpbmYpID0gaW5mCisgKglzcXJ0KC12ZSkgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsCisgKglzcXJ0KE5hTikgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsIGZvciBzaWduYWxpbmcgTmFOCisgKgorICogT3RoZXIgbWV0aG9kcyA6IHNlZSB0aGUgYXBwZW5kZWQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGJlbG93LgorICotLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMJY29uc3QgZG91YmxlCW9uZQk9IDEuMCwgdGlueT0xLjBlLTMwMDsKKworZG91YmxlCitfX2llZWU3NTRfc3FydChkb3VibGUgeCkKK3sKKwlkb3VibGUgejsKKwlpbnQzMl90IHNpZ24gPSAoaW50KTB4ODAwMDAwMDA7CisJaW50MzJfdCBpeDAsczAscSxtLHQsaTsKKwl1X2ludDMyX3Qgcix0MSxzMSxpeDEscTE7CisKKwlFWFRSQUNUX1dPUkRTKGl4MCxpeDEseCk7CisKKyAgICAvKiB0YWtlIGNhcmUgb2YgSW5mIGFuZCBOYU4gKi8KKwlpZigoaXgwJjB4N2ZmMDAwMDApPT0weDdmZjAwMDAwKSB7CQkJCisJICAgIHJldHVybiB4KngreDsJCS8qIHNxcnQoTmFOKT1OYU4sIHNxcnQoK2luZik9K2luZgorCQkJCQkgICBzcXJ0KC1pbmYpPXNOYU4gKi8KKwl9IAorICAgIC8qIHRha2UgY2FyZSBvZiB6ZXJvICovCisJaWYoaXgwPD0wKSB7CisJICAgIGlmKCgoaXgwJih+c2lnbikpfGl4MSk9PTApIHJldHVybiB4Oy8qIHNxcnQoKy0wKSA9ICstMCAqLworCSAgICBlbHNlIGlmKGl4MDwwKQorCQlyZXR1cm4gKHgteCkvKHgteCk7CQkvKiBzcXJ0KC12ZSkgPSBzTmFOICovCisJfQorICAgIC8qIG5vcm1hbGl6ZSB4ICovCisJbSA9IChpeDA+PjIwKTsKKwlpZihtPT0wKSB7CQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIHdoaWxlKGl4MD09MCkgeworCQltIC09IDIxOworCQlpeDAgfD0gKGl4MT4+MTEpOyBpeDEgPDw9IDIxOworCSAgICB9CisJICAgIGZvcihpPTA7KGl4MCYweDAwMTAwMDAwKT09MDtpKyspIGl4MDw8PTE7CisJICAgIG0gLT0gaS0xOworCSAgICBpeDAgfD0gKGl4MT4+KDMyLWkpKTsKKwkgICAgaXgxIDw8PSBpOworCX0KKwltIC09IDEwMjM7CS8qIHVuYmlhcyBleHBvbmVudCAqLworCWl4MCA9IChpeDAmMHgwMDBmZmZmZil8MHgwMDEwMDAwMDsKKwlpZihtJjEpewkvKiBvZGQgbSwgZG91YmxlIHggdG8gbWFrZSBpdCBldmVuICovCisJICAgIGl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCSAgICBpeDEgKz0gaXgxOworCX0KKwltID4+PSAxOwkvKiBtID0gW20vMl0gKi8KKworICAgIC8qIGdlbmVyYXRlIHNxcnQoeCkgYml0IGJ5IGJpdCAqLworCWl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCWl4MSArPSBpeDE7CisJcSA9IHExID0gczAgPSBzMSA9IDA7CS8qIFtxLHExXSA9IHNxcnQoeCkgKi8KKwlyID0gMHgwMDIwMDAwMDsJCS8qIHIgPSBtb3ZpbmcgYml0IGZyb20gcmlnaHQgdG8gbGVmdCAqLworCisJd2hpbGUociE9MCkgeworCSAgICB0ID0gczArcjsgCisJICAgIGlmKHQ8PWl4MCkgeyAKKwkJczAgICA9IHQrcjsgCisJCWl4MCAtPSB0OyAKKwkJcSAgICs9IHI7IAorCSAgICB9IAorCSAgICBpeDAgKz0gaXgwICsgKChpeDEmc2lnbik+PjMxKTsKKwkgICAgaXgxICs9IGl4MTsKKwkgICAgcj4+PTE7CisJfQorCisJciA9IHNpZ247CisJd2hpbGUociE9MCkgeworCSAgICB0MSA9IHMxK3I7IAorCSAgICB0ICA9IHMwOworCSAgICBpZigodDxpeDApfHwoKHQ9PWl4MCkmJih0MTw9aXgxKSkpIHsgCisJCXMxICA9IHQxK3I7CisJCWlmKCgodDEmc2lnbik9PXNpZ24pJiYoczEmc2lnbik9PTApIHMwICs9IDE7CisJCWl4MCAtPSB0OworCQlpZiAoaXgxIDwgdDEpIGl4MCAtPSAxOworCQlpeDEgLT0gdDE7CisJCXExICArPSByOworCSAgICB9CisJICAgIGl4MCArPSBpeDAgKyAoKGl4MSZzaWduKT4+MzEpOworCSAgICBpeDEgKz0gaXgxOworCSAgICByPj49MTsKKwl9CisKKyAgICAvKiB1c2UgZmxvYXRpbmcgYWRkIHRvIGZpbmQgb3V0IHJvdW5kaW5nIGRpcmVjdGlvbiAqLworCWlmKChpeDB8aXgxKSE9MCkgeworCSAgICB6ID0gb25lLXRpbnk7IC8qIHRyaWdnZXIgaW5leGFjdCBmbGFnICovCisJICAgIGlmICh6Pj1vbmUpIHsKKwkgICAgICAgIHogPSBvbmUrdGlueTsKKwkgICAgICAgIGlmIChxMT09KHVfaW50MzJfdCkweGZmZmZmZmZmKSB7IHExPTA7IHEgKz0gMTt9CisJCWVsc2UgaWYgKHo+b25lKSB7CisJCSAgICBpZiAocTE9PSh1X2ludDMyX3QpMHhmZmZmZmZmZSkgcSs9MTsKKwkJICAgIHExKz0yOyAKKwkJfSBlbHNlCisJICAgICAgICAgICAgcTEgKz0gKHExJjEpOworCSAgICB9CisJfQorCWl4MCA9IChxPj4xKSsweDNmZTAwMDAwOworCWl4MSA9ICBxMT4+MTsKKwlpZiAoKHEmMSk9PTEpIGl4MSB8PSBzaWduOworCWl4MCArPSAobSA8PDIwKTsKKwlJTlNFUlRfV09SRFMoeixpeDAsaXgxKTsKKwlyZXR1cm4gejsKK30KKworLyoKK090aGVyIG1ldGhvZHMgICh1c2UgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYykKKy0tLS0tLS0tLS0tLS0KKyhUaGlzIGlzIGEgY29weSBvZiBhIGRyYWZ0ZWQgcGFwZXIgYnkgUHJvZiBXLiBLYWhhbiAKK2FuZCBLLkMuIE5nLCB3cml0dGVuIGluIE1heSwgMTk4NikKKworCVR3byBhbGdvcml0aG1zIGFyZSBnaXZlbiBoZXJlIHRvIGltcGxlbWVudCBzcXJ0KHgpIAorCShJRUVFIGRvdWJsZSBwcmVjaXNpb24gYXJpdGhtZXRpYykgaW4gc29mdHdhcmUuCisJQm90aCBzdXBwbHkgc3FydCh4KSBjb3JyZWN0bHkgcm91bmRlZC4gVGhlIGZpcnN0IGFsZ29yaXRobSAoaW4KKwlTZWN0aW9uIEEpIHVzZXMgbmV3dG9uIGl0ZXJhdGlvbnMgYW5kIGludm9sdmVzIGZvdXIgZGl2aXNpb25zLgorCVRoZSBzZWNvbmQgb25lIHVzZXMgcmVjaXByb290IGl0ZXJhdGlvbnMgdG8gYXZvaWQgZGl2aXNpb24sIGJ1dAorCXJlcXVpcmVzIG1vcmUgbXVsdGlwbGljYXRpb25zLiBCb3RoIGFsZ29yaXRobXMgbmVlZCB0aGUgYWJpbGl0eQorCXRvIGNob3AgcmVzdWx0cyBvZiBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW5zdGVhZCBvZiByb3VuZCB0aGVtLCAKKwlhbmQgdGhlIElORVhBQ1QgZmxhZyB0byBpbmRpY2F0ZSB3aGVuIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uCisJaXMgZXhlY3V0ZWQgZXhhY3RseSB3aXRoIG5vIHJvdW5kb2ZmIGVycm9yLCBhbGwgcGFydCBvZiB0aGUgCisJc3RhbmRhcmQgKElFRUUgNzU0LTE5ODUpLiBUaGUgYWJpbGl0eSB0byBwZXJmb3JtIHNoaWZ0LCBhZGQsCisJc3VidHJhY3QgYW5kIGxvZ2ljYWwgQU5EIG9wZXJhdGlvbnMgdXBvbiAzMi1iaXQgd29yZHMgaXMgbmVlZGVkCisJdG9vLCB0aG91Z2ggbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgorCitBLiAgc3FydCh4KSBieSBOZXd0b24gSXRlcmF0aW9uCisKKyAgICgxKQlJbml0aWFsIGFwcHJveGltYXRpb24KKworCUxldCB4MCBhbmQgeDEgYmUgdGhlIGxlYWRpbmcgYW5kIHRoZSB0cmFpbGluZyAzMi1iaXQgd29yZHMgb2YKKwlhIGZsb2F0aW5nIHBvaW50IG51bWJlciB4IChpbiBJRUVFIGRvdWJsZSBmb3JtYXQpIHJlc3BlY3RpdmVseSAKKworCSAgICAxICAgIDExCQkgICAgIDUyCQkJCSAgLi4ud2lkdGhzCisJICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJeDogfHN8CSAgZSAgICAgfAkgICAgICBmCQkJCXwKKwkgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgICBtc2IgICAgbHNiICBtc2IJCQkJICAgICAgbHNiIC4uLm9yZGVyCisKKyAKKwkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJeDA6ICB8c3wgICBlICAgIHwgICAgZjEgICAgIHwJIHgxOiB8ICAgICAgICAgIGYyICAgICAgICAgICB8CisJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJQnkgcGVyZm9ybWluZyBzaGlmdHMgYW5kIHN1YnRyYWN0cyBvbiB4MCBhbmQgeDEgKGJvdGggcmVnYXJkZWQKKwlhcyBpbnRlZ2VycyksIHdlIG9idGFpbiBhbiA4LWJpdCBhcHByb3hpbWF0aW9uIG9mIHNxcnQoeCkgYXMKKwlmb2xsb3dzLgorCisJCWsgIDo9ICh4MD4+MSkgKyAweDFmZjgwMDAwOworCQl5MCA6PSBrIC0gVDFbMzEmKGs+PjE1KV0uCS4uLiB5IH4gc3FydCh4KSB0byA4IGJpdHMKKwlIZXJlIGsgaXMgYSAzMi1iaXQgaW50ZWdlciBhbmQgVDFbXSBpcyBhbiBpbnRlZ2VyIGFycmF5IGNvbnRhaW5pbmcKKwljb3JyZWN0aW9uIHRlcm1zLiBOb3cgbWFnaWNhbGx5IHRoZSBmbG9hdGluZyB2YWx1ZSBvZiB5ICh5J3MKKwlsZWFkaW5nIDMyLWJpdCB3b3JkIGlzIHkwLCB0aGUgdmFsdWUgb2YgaXRzIHRyYWlsaW5nIHdvcmQgaXMgMCkKKwlhcHByb3hpbWF0ZXMgc3FydCh4KSB0byBhbG1vc3QgOC1iaXQuCisKKwlWYWx1ZSBvZiBUMToKKwlzdGF0aWMgaW50IFQxWzMyXT0geworCTAsCTEwMjQsCTMwNjIsCTU3NDYsCTkxOTMsCTEzMzQ4LAkxODE2MiwJMjM1OTIsCisJMjk1OTgsCTM2MTQ1LAk0MzIwMiwJNTA3NDAsCTU4NzMzLAk2NzE1OCwJNzU5OTIsCTg1MjE1LAorCTgzNTk5LAk3MTM3OCwJNjA0MjgsCTUwNjQ3LAk0MTk0NSwJMzQyNDYsCTI3NDc4LAkyMTU4MSwKKwkxNjQ5OSwJMTIxODMsCTg1ODgsCTU2NzQsCTM0MDMsCTE3NDIsCTY2MSwJMTMwLH07CisKKyAgICAoMikJSXRlcmF0aXZlIHJlZmluZW1lbnQKKworCUFwcGx5IEhlcm9uJ3MgcnVsZSB0aHJlZSB0aW1lcyB0byB5LCB3ZSBoYXZlIHkgYXBwcm94aW1hdGVzIAorCXNxcnQoeCkgdG8gd2l0aGluIDEgdWxwIChVbml0IGluIHRoZSBMYXN0IFBsYWNlKToKKworCQl5IDo9ICh5K3gveSkvMgkJLi4uIGFsbW9zdCAxNyBzaWcuIGJpdHMKKwkJeSA6PSAoeSt4L3kpLzIJCS4uLiBhbG1vc3QgMzUgc2lnLiBiaXRzCisJCXkgOj0geS0oeS14L3kpLzIJLi4uIHdpdGhpbiAxIHVscAorCisKKwlSZW1hcmsgMS4KKwkgICAgQW5vdGhlciB3YXkgdG8gaW1wcm92ZSB5IHRvIHdpdGhpbiAxIHVscCBpczoKKworCQl5IDo9ICh5K3gveSkJCS4uLiBhbG1vc3QgMTcgc2lnLiBiaXRzIHRvIDIqc3FydCh4KQorCQl5IDo9IHkgLSAweDAwMTAwMDA2CS4uLiBhbG1vc3QgMTggc2lnLiBiaXRzIHRvIHNxcnQoeCkKKworCQkJCTIKKwkJCSAgICAoeC15ICkqeQorCQl5IDo9IHkgKyAyKiAtLS0tLS0tLS0tCS4uLndpdGhpbiAxIHVscAorCQkJICAgICAgIDIKKwkJCSAgICAgM3kgICsgeAorCisKKwlUaGlzIGZvcm11bGEgaGFzIG9uZSBkaXZpc2lvbiBmZXdlciB0aGFuIHRoZSBvbmUgYWJvdmU7IGhvd2V2ZXIsCisJaXQgcmVxdWlyZXMgbW9yZSBtdWx0aXBsaWNhdGlvbnMgYW5kIGFkZGl0aW9ucy4gQWxzbyB4IG11c3QgYmUKKwlzY2FsZWQgaW4gYWR2YW5jZSB0byBhdm9pZCBzcHVyaW91cyBvdmVyZmxvdyBpbiBldmFsdWF0aW5nIHRoZQorCWV4cHJlc3Npb24gM3kqeSt4LiBIZW5jZSBpdCBpcyBub3QgcmVjb21tZW5kZWQgdWxlc3MgZGl2aXNpb24KKwlpcyBzbG93LiBJZiBkaXZpc2lvbiBpcyB2ZXJ5IHNsb3csIHRoZW4gb25lIHNob3VsZCB1c2UgdGhlIAorCXJlY2lwcm9vdCBhbGdvcml0aG0gZ2l2ZW4gaW4gc2VjdGlvbiBCLgorCisgICAgKDMpIEZpbmFsIGFkanVzdG1lbnQKKworCUJ5IHR3aWRkbGluZyB5J3MgbGFzdCBiaXQgaXQgaXMgcG9zc2libGUgdG8gZm9yY2UgeSB0byBiZSAKKwljb3JyZWN0bHkgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZQorCWFzIGZvbGxvd3MuIExldCByIGFuZCBpIGJlIGNvcGllcyBvZiB0aGUgcm91bmRpbmcgbW9kZSBhbmQKKwlpbmV4YWN0IGZsYWcgYmVmb3JlIGVudGVyaW5nIHRoZSBzcXVhcmUgcm9vdCBwcm9ncmFtLiBBbHNvIHdlCisJdXNlIHRoZSBleHByZXNzaW9uIHkrLXVscCBmb3IgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdGluZworCW51bWJlcnMgKHVwIGFuZCBkb3duKSBvZiB5LiBOb3RlIHRoYXQgeSstdWxwID0gZWl0aGVyIGZpeGVkCisJcG9pbnQgeSstMSwgb3IgbXVsdGlwbHkgeSBieSBuZXh0YWZ0ZXIoMSwrLWluZikgaW4gY2hvcHBlZAorCW1vZGUuCisKKwkJSSA6PSBGQUxTRTsJLi4uIHJlc2V0IElORVhBQ1QgZmxhZyBJCisJCVIgOj0gUlo7CS4uLiBzZXQgcm91bmRpbmcgbW9kZSB0byByb3VuZC10b3dhcmQtemVybworCQl6IDo9IHgveTsJLi4uIGNob3BwZWQgcXVvdGllbnQsIHBvc3NpYmx5IGluZXhhY3QKKwkJSWYobm90IEkpIHRoZW4gewkuLi4gaWYgdGhlIHF1b3RpZW50IGlzIGV4YWN0CisJCSAgICBpZih6PXkpIHsKKwkJICAgICAgICBJIDo9IGk7CSAuLi4gcmVzdG9yZSBpbmV4YWN0IGZsYWcKKwkJICAgICAgICBSIDo9IHI7ICAuLi4gcmVzdG9yZSByb3VuZGVkIG1vZGUKKwkJICAgICAgICByZXR1cm4gc3FydCh4KTo9eS4KKwkJICAgIH0gZWxzZSB7CisJCQl6IDo9IHogLSB1bHA7CS4uLiBzcGVjaWFsIHJvdW5kaW5nCisJCSAgICB9CisJCX0KKwkJaSA6PSBUUlVFOwkJLi4uIHNxcnQoeCkgaXMgaW5leGFjdAorCQlJZiAocj1STikgdGhlbiB6PXordWxwCS4uLiByb3VuZGVkLXRvLW5lYXJlc3QKKwkJSWYgKHI9UlApIHRoZW4gewkuLi4gcm91bmQtdG93YXJkLStpbmYKKwkJICAgIHkgPSB5K3VscDsgej16K3VscDsKKwkJfQorCQl5IDo9IHkrejsJCS4uLiBjaG9wcGVkIHN1bQorCQl5MDo9eTAtMHgwMDEwMDAwMDsJLi4uIHkgOj0geS8yIGlzIGNvcnJlY3RseSByb3VuZGVkLgorCSAgICAgICAgSSA6PSBpOwkgCQkuLi4gcmVzdG9yZSBpbmV4YWN0IGZsYWcKKwkgICAgICAgIFIgOj0gcjsgIAkJLi4uIHJlc3RvcmUgcm91bmRlZCBtb2RlCisJICAgICAgICByZXR1cm4gc3FydCh4KTo9eS4KKwkJICAgIAorICAgICg0KQlTcGVjaWFsIGNhc2VzCisKKwlTcXVhcmUgcm9vdCBvZiAraW5mLCArLTAsIG9yIE5hTiBpcyBpdHNlbGY7CisJU3F1YXJlIHJvb3Qgb2YgYSBuZWdhdGl2ZSBudW1iZXIgaXMgTmFOIHdpdGggaW52YWxpZCBzaWduYWwuCisKKworQi4gIHNxcnQoeCkgYnkgUmVjaXByb290IEl0ZXJhdGlvbgorCisgICAoMSkJSW5pdGlhbCBhcHByb3hpbWF0aW9uCisKKwlMZXQgeDAgYW5kIHgxIGJlIHRoZSBsZWFkaW5nIGFuZCB0aGUgdHJhaWxpbmcgMzItYml0IHdvcmRzIG9mCisJYSBmbG9hdGluZyBwb2ludCBudW1iZXIgeCAoaW4gSUVFRSBkb3VibGUgZm9ybWF0KSByZXNwZWN0aXZlbHkKKwkoc2VlIHNlY3Rpb24gQSkuIEJ5IHBlcmZvcm1pbmcgc2hpZnMgYW5kIHN1YnRyYWN0cyBvbiB4MCBhbmQgeTAsCisJd2Ugb2J0YWluIGEgNy44LWJpdCBhcHByb3hpbWF0aW9uIG9mIDEvc3FydCh4KSBhcyBmb2xsb3dzLgorCisJICAgIGsgOj0gMHg1ZmU4MDAwMCAtICh4MD4+MSk7CisJICAgIHkwOj0gayAtIFQyWzYzJihrPj4xNCldLgkuLi4geSB+IDEvc3FydCh4KSB0byA3LjggYml0cworCisJSGVyZSBrIGlzIGEgMzItYml0IGludGVnZXIgYW5kIFQyW10gaXMgYW4gaW50ZWdlciBhcnJheSAKKwljb250YWluaW5nIGNvcnJlY3Rpb24gdGVybXMuIE5vdyBtYWdpY2FsbHkgdGhlIGZsb2F0aW5nCisJdmFsdWUgb2YgeSAoeSdzIGxlYWRpbmcgMzItYml0IHdvcmQgaXMgeTAsIHRoZSB2YWx1ZSBvZgorCWl0cyB0cmFpbGluZyB3b3JkIHkxIGlzIHNldCB0byB6ZXJvKSBhcHByb3hpbWF0ZXMgMS9zcXJ0KHgpCisJdG8gYWxtb3N0IDcuOC1iaXQuCisKKwlWYWx1ZSBvZiBUMjoKKwlzdGF0aWMgaW50IFQyWzY0XT0geworCTB4MTUwMCwJMHgyZWY4LAkweDRkNjcsCTB4NmIwMiwJMHg4N2JlLAkweGEzOTUsCTB4YmU3YSwJMHhkODY2LAorCTB4ZjE0YSwJMHgxMDkxYiwweDExZmNkLDB4MTM1NTIsMHgxNDk5OSwweDE1Yzk4LDB4MTZlMzQsMHgxN2U1ZiwKKwkweDE4ZDAzLDB4MTlhMDEsMHgxYTU0NSwweDFhZThhLDB4MWI1YzQsMHgxYmIwMSwweDFiZmRlLDB4MWMyOGQsCisJMHgxYzJkZSwweDFjMGRiLDB4MWJhNzMsMHgxYjExYywweDFhNGI1LDB4MTk1M2QsMHgxODI2NiwweDE2YmUwLAorCTB4MTY4M2UsMHgxNzlkOCwweDE4YTRkLDB4MTk5OTIsMHgxYTc4OSwweDFiNDQ1LDB4MWJmNjEsMHgxYzk4OSwKKwkweDFkMTZkLDB4MWQ3N2IsMHgxZGRkZiwweDFlMmFkLDB4MWU1YmYsMHgxZTZlOCwweDFlNjU0LDB4MWUzY2QsCisJMHgxZGYyYSwweDFkNjM1LDB4MWNiMTYsMHgxYmUyYywweDFhZTRlLDB4MTliZGUsMHgxODY4ZSwweDE2ZTJlLAorCTB4MTUyN2YsMHgxMzM0YSwweDExMDUxLDB4ZTk1MSwJMHhiZTAxLAkweDhlMGQsCTB4NTkyNCwJMHgxZWRkLH07CisKKyAgICAoMikJSXRlcmF0aXZlIHJlZmluZW1lbnQKKworCUFwcGx5IFJlY2lwcm9vdCBpdGVyYXRpb24gdGhyZWUgdGltZXMgdG8geSBhbmQgbXVsdGlwbHkgdGhlCisJcmVzdWx0IGJ5IHggdG8gZ2V0IGFuIGFwcHJveGltYXRpb24geiB0aGF0IG1hdGNoZXMgc3FydCh4KQorCXRvIGFib3V0IDEgdWxwLiBUbyBiZSBleGFjdCwgd2Ugd2lsbCBoYXZlIAorCQktMXVscCA8IHNxcnQoeCktejwxLjA2MjV1bHAuCisJCisJLi4uIHNldCByb3VuZGluZyBtb2RlIHRvIFJvdW5kLXRvLW5lYXJlc3QKKwkgICB5IDo9IHkqKDEuNS0wLjUqeCp5KnkpCS4uLiBhbG1vc3QgMTUgc2lnLiBiaXRzIHRvIDEvc3FydCh4KQorCSAgIHkgOj0geSooKDEuNS0yXi0zMCkrMC41KngqeSp5KS4uLiBhYm91dCAyOSBzaWcuIGJpdHMgdG8gMS9zcXJ0KHgpCisJLi4uIHNwZWNpYWwgYXJyYW5nZW1lbnQgZm9yIGJldHRlciBhY2N1cmFjeQorCSAgIHogOj0geCp5CQkJLi4uIDI5IGJpdHMgdG8gc3FydCh4KSwgd2l0aCB6Knk8MQorCSAgIHogOj0geiArIDAuNSp6KigxLXoqeSkJLi4uIGFib3V0IDEgdWxwIHRvIHNxcnQoeCkKKworCVJlbWFyayAyLiBUaGUgY29uc3RhbnQgMS41LTJeLTMwIGlzIGNob3NlbiB0byBiaWFzIHRoZSBlcnJvciBzbyB0aGF0CisJKGEpIHRoZSB0ZXJtIHoqeSBpbiB0aGUgZmluYWwgaXRlcmF0aW9uIGlzIGFsd2F5cyBsZXNzIHRoYW4gMTsgCisJKGIpIHRoZSBlcnJvciBpbiB0aGUgZmluYWwgcmVzdWx0IGlzIGJpYXNlZCB1cHdhcmQgc28gdGhhdAorCQktMSB1bHAgPCBzcXJ0KHgpIC0geiA8IDEuMDYyNSB1bHAKKwkgICAgaW5zdGVhZCBvZiB8c3FydCh4KS16fDwxLjAzMTI1dWxwLgorCisgICAgKDMpCUZpbmFsIGFkanVzdG1lbnQKKworCUJ5IHR3aWRkbGluZyB5J3MgbGFzdCBiaXQgaXQgaXMgcG9zc2libGUgdG8gZm9yY2UgeSB0byBiZSAKKwljb3JyZWN0bHkgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZQorCWFzIGZvbGxvd3MuIExldCByIGFuZCBpIGJlIGNvcGllcyBvZiB0aGUgcm91bmRpbmcgbW9kZSBhbmQKKwlpbmV4YWN0IGZsYWcgYmVmb3JlIGVudGVyaW5nIHRoZSBzcXVhcmUgcm9vdCBwcm9ncmFtLiBBbHNvIHdlCisJdXNlIHRoZSBleHByZXNzaW9uIHkrLXVscCBmb3IgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdGluZworCW51bWJlcnMgKHVwIGFuZCBkb3duKSBvZiB5LiBOb3RlIHRoYXQgeSstdWxwID0gZWl0aGVyIGZpeGVkCisJcG9pbnQgeSstMSwgb3IgbXVsdGlwbHkgeSBieSBuZXh0YWZ0ZXIoMSwrLWluZikgaW4gY2hvcHBlZAorCW1vZGUuCisKKwlSIDo9IFJaOwkJLi4uIHNldCByb3VuZGluZyBtb2RlIHRvIHJvdW5kLXRvd2FyZC16ZXJvCisJc3dpdGNoKHIpIHsKKwkgICAgY2FzZSBSTjoJCS4uLiByb3VuZC10by1uZWFyZXN0CisJICAgICAgIGlmKHg8PSB6Kih6LXVscCkuLi5jaG9wcGVkKSB6ID0geiAtIHVscDsgZWxzZQorCSAgICAgICBpZih4PD0geiooeit1bHApLi4uY2hvcHBlZCkgeiA9IHo7IGVsc2UgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBSWjpjYXNlIFJNOgkuLi4gcm91bmQtdG8temVybyBvciByb3VuZC10by0taW5mCisJICAgICAgIFI6PVJQOwkJLi4uIHJlc2V0IHJvdW5kaW5nIG1vZCB0byByb3VuZC10by0raW5mCisJICAgICAgIGlmKHg8eip6IC4uLiByb3VuZGVkIHVwKSB6ID0geiAtIHVscDsgZWxzZQorCSAgICAgICBpZih4Pj0oeit1bHApKih6K3VscCkgLi4ucm91bmRlZCB1cCkgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwkgICAgY2FzZSBSUDoJCS4uLiByb3VuZC10by0raW5mCisJICAgICAgIGlmKHg+KHordWxwKSooeit1bHApLi4uY2hvcHBlZCkgeiA9IHorMip1bHA7IGVsc2UKKwkgICAgICAgaWYoeD56KnogLi4uY2hvcHBlZCkgeiA9IHordWxwOworCSAgICAgICBicmVhazsKKwl9CisKKwlSZW1hcmsgMy4gVGhlIGFib3ZlIGNvbXBhcmlzb25zIGNhbiBiZSBkb25lIGluIGZpeGVkIHBvaW50LiBGb3IKKwlleGFtcGxlLCB0byBjb21wYXJlIHggYW5kIHc9eip6IGNob3BwZWQsIGl0IHN1ZmZpY2VzIHRvIGNvbXBhcmUKKwl4MSBhbmQgdzEgKHRoZSB0cmFpbGluZyBwYXJ0cyBvZiB4IGFuZCB3KSwgcmVnYXJkaW5nIHRoZW0gYXMKKwl0d28ncyBjb21wbGVtZW50IGludGVnZXJzLgorCisJLi4uSXMgeiBhbiBleGFjdCBzcXVhcmUgcm9vdD8KKwlUbyBkZXRlcm1pbmUgd2hldGhlciB6IGlzIGFuIGV4YWN0IHNxdWFyZSByb290IG9mIHgsIGxldCB6MSBiZSB0aGUKKwl0cmFpbGluZyBwYXJ0IG9mIHosIGFuZCBhbHNvIGxldCB4MCBhbmQgeDEgYmUgdGhlIGxlYWRpbmcgYW5kCisJdHJhaWxpbmcgcGFydHMgb2YgeC4KKworCUlmICgoejEmMHgwM2ZmZmZmZikhPTApCS4uLiBub3QgZXhhY3QgaWYgdHJhaWxpbmcgMjYgYml0cyBvZiB6IT0wCisJICAgIEkgOj0gMTsJCS4uLiBSYWlzZSBJbmV4YWN0IGZsYWc6IHogaXMgbm90IGV4YWN0CisJZWxzZSB7CisJICAgIGogOj0gMSAtIFsoeDA+PjIwKSYxXQkuLi4gaiA9IGxvZ2IoeCkgbW9kIDIKKwkgICAgayA6PSB6MSA+PiAyNjsJCS4uLiBnZXQgeidzIDI1LXRoIGFuZCAyNi10aCAKKwkJCQkJICAgIGZyYWN0aW9uIGJpdHMKKwkgICAgSSA6PSBpIG9yIChrJmopIG9yICgoayYoaitqKzEpKSE9KHgxJjMpKTsKKwl9CisJUjo9IHIJCS4uLiByZXN0b3JlIHJvdW5kZWQgbW9kZQorCXJldHVybiBzcXJ0KHgpOj16LgorCisJSWYgbXVsdGlwbGljYXRpb24gaXMgY2hlYXBlciB0aGVuIHRoZSBmb3JlZ29pbmcgcmVkIHRhcGUsIHRoZSAKKwlJbmV4YWN0IGZsYWcgY2FuIGJlIGV2YWx1YXRlZCBieQorCisJICAgIEkgOj0gaTsKKwkgICAgSSA6PSAoeip6IT14KSBvciBJLgorCisJTm90ZSB0aGF0IHoqeiBjYW4gb3ZlcndyaXRlIEk7IHRoaXMgdmFsdWUgbXVzdCBiZSBzZW5zZWQgaWYgaXQgaXMgCisJVHJ1ZS4KKworCVJlbWFyayA0LiBJZiB6KnogPSB4IGV4YWN0bHksIHRoZW4gYml0IDI1IHRvIGJpdCAwIG9mIHoxIG11c3QgYmUKKwl6ZXJvLgorCisJCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQl6MTogfCAgICAgICAgZjIgICAgICAgIHwgCisJCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCQliaXQgMzEJCSAgIGJpdCAwCisKKwlGdXJ0aGVyIG1vcmUsIGJpdCAyNyBhbmQgMjYgb2YgejEsIGJpdCAwIGFuZCAxIG9mIHgxLCBhbmQgdGhlIG9kZAorCW9yIGV2ZW4gb2YgbG9nYih4KSBoYXZlIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zOgorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWJpdCAyNywyNiBvZiB6MQkJYml0IDEsMCBvZiB4MQlsb2diKHgpCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTAwCQkJMDAJCW9kZCBhbmQgZXZlbgorCTAxCQkJMDEJCWV2ZW4KKwkxMAkJCTEwCQlvZGQKKwkxMAkJCTAwCQlldmVuCisJMTEJCQkwMQkJZXZlbgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICg0KQlTcGVjaWFsIGNhc2VzIChzZWUgKDQpIG9mIFNlY3Rpb24gQSkuCQorIAorICovCisgCmRpZmYgLS1naXQgYS9saWJtL3NyYy9lX3NxcnRmLmMgYi9saWJtL3NyYy9lX3NxcnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjOWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL2Vfc3FydGYuYwpAQCAtMCwwICsxLDg5IEBACisvKiBlX3NxcnRmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBlX3NxcnQuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2Vfc3FydGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljCWNvbnN0IGZsb2F0CW9uZQk9IDEuMCwgdGlueT0xLjBlLTMwOworCitmbG9hdAorX19pZWVlNzU0X3NxcnRmKGZsb2F0IHgpCit7CisJZmxvYXQgejsKKwlpbnQzMl90IHNpZ24gPSAoaW50KTB4ODAwMDAwMDA7CisJaW50MzJfdCBpeCxzLHEsbSx0LGk7CisJdV9pbnQzMl90IHI7CisKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKworICAgIC8qIHRha2UgY2FyZSBvZiBJbmYgYW5kIE5hTiAqLworCWlmKChpeCYweDdmODAwMDAwKT09MHg3ZjgwMDAwMCkgeworCSAgICByZXR1cm4geCp4K3g7CQkvKiBzcXJ0KE5hTik9TmFOLCBzcXJ0KCtpbmYpPStpbmYKKwkJCQkJICAgc3FydCgtaW5mKT1zTmFOICovCisJfQorICAgIC8qIHRha2UgY2FyZSBvZiB6ZXJvICovCisJaWYoaXg8PTApIHsKKwkgICAgaWYoKGl4Jih+c2lnbikpPT0wKSByZXR1cm4geDsvKiBzcXJ0KCstMCkgPSArLTAgKi8KKwkgICAgZWxzZSBpZihpeDwwKQorCQlyZXR1cm4gKHgteCkvKHgteCk7CQkvKiBzcXJ0KC12ZSkgPSBzTmFOICovCisJfQorICAgIC8qIG5vcm1hbGl6ZSB4ICovCisJbSA9IChpeD4+MjMpOworCWlmKG09PTApIHsJCQkJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yKGk9MDsoaXgmMHgwMDgwMDAwMCk9PTA7aSsrKSBpeDw8PTE7CisJICAgIG0gLT0gaS0xOworCX0KKwltIC09IDEyNzsJLyogdW5iaWFzIGV4cG9uZW50ICovCisJaXggPSAoaXgmMHgwMDdmZmZmZil8MHgwMDgwMDAwMDsKKwlpZihtJjEpCS8qIG9kZCBtLCBkb3VibGUgeCB0byBtYWtlIGl0IGV2ZW4gKi8KKwkgICAgaXggKz0gaXg7CisJbSA+Pj0gMTsJLyogbSA9IFttLzJdICovCisKKyAgICAvKiBnZW5lcmF0ZSBzcXJ0KHgpIGJpdCBieSBiaXQgKi8KKwlpeCArPSBpeDsKKwlxID0gcyA9IDA7CQkvKiBxID0gc3FydCh4KSAqLworCXIgPSAweDAxMDAwMDAwOwkJLyogciA9IG1vdmluZyBiaXQgZnJvbSByaWdodCB0byBsZWZ0ICovCisKKwl3aGlsZShyIT0wKSB7CisJICAgIHQgPSBzK3I7CisJICAgIGlmKHQ8PWl4KSB7CisJCXMgICAgPSB0K3I7CisJCWl4ICAtPSB0OworCQlxICAgKz0gcjsKKwkgICAgfQorCSAgICBpeCArPSBpeDsKKwkgICAgcj4+PTE7CisJfQorCisgICAgLyogdXNlIGZsb2F0aW5nIGFkZCB0byBmaW5kIG91dCByb3VuZGluZyBkaXJlY3Rpb24gKi8KKwlpZihpeCE9MCkgeworCSAgICB6ID0gb25lLXRpbnk7IC8qIHRyaWdnZXIgaW5leGFjdCBmbGFnICovCisJICAgIGlmICh6Pj1vbmUpIHsKKwkgICAgICAgIHogPSBvbmUrdGlueTsKKwkJaWYgKHo+b25lKQorCQkgICAgcSArPSAyOworCQllbHNlCisJCSAgICBxICs9IChxJjEpOworCSAgICB9CisJfQorCWl4ID0gKHE+PjEpKzB4M2YwMDAwMDA7CisJaXggKz0gKG0gPDwyMyk7CisJU0VUX0ZMT0FUX1dPUkQoeixpeCk7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9mcG1hdGguaCBiL2xpYm0vc3JjL2ZwbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWJkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9mcG1hdGguaApAQCAtMCwwICsxLDcyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWtlIEJhcmNyb2Z0IDxtaWtlQEZyZWVCU0Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGliYy9pbmNsdWRlL2ZwbWF0aC5oLHYgMS4zIDIwMDUvMDIvMDYgMDM6MjM6MzEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgIl9mcG1hdGguaCIKKwordW5pb24gSUVFRWYyYml0cyB7CisJZmxvYXQJZjsKKwlzdHJ1Y3QgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwkJdW5zaWduZWQgaW50CW1hbgk6MjM7CisJCXVuc2lnbmVkIGludAlleHAJOjg7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworI2Vsc2UgLyogX0JJR19FTkRJQU4gKi8KKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlleHAJOjg7CisJCXVuc2lnbmVkIGludAltYW4JOjIzOworI2VuZGlmCisJfSBiaXRzOworfTsKKworI2RlZmluZQlEQkxfTUFOSF9TSVpFCTIwCisjZGVmaW5lCURCTF9NQU5MX1NJWkUJMzIKKwordW5pb24gSUVFRWQyYml0cyB7CisJZG91YmxlCWQ7CisJc3RydWN0IHsKKy8qICNpZmRlZiBfX0FSTUVCX18gKi8KKyNpZiAoX19CWVRFX09SREVSID09IF9fQklHX0VORElBTikgfHwgKGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19WRlBfRlBfXykpCisJCXVuc2lnbmVkIGludAltYW5oCToyMDsKKwkJdW5zaWduZWQgaW50CWV4cAk6MTE7CisJCXVuc2lnbmVkIGludAlzaWduCToxOworCQl1bnNpZ25lZCBpbnQJbWFubAk6MzI7CisjZWxpZiAgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAKKwkJdW5zaWduZWQgaW50CW1hbmwJOjMyOworCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJc2lnbgk6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwkJdW5zaWduZWQgaW50CXNpZ24JOjE7CisJCXVuc2lnbmVkIGludAlleHAJOjExOworCQl1bnNpZ25lZCBpbnQJbWFuaAk6MjA7CisJCXVuc2lnbmVkIGludAltYW5sCTozMjsKKyNlbmRpZgorCX0gYml0czsKK307CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX2Nvcy5jIGIvbGlibS9zcmMva19jb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkxNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19jb3MuYwpAQCAtMCwwICsxLDc5IEBACisKKy8qIEAoIylrX2Nvcy5jIDEuMyA5NS8wMS8xOCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blNvZnQsIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX2Nvcy5jLHYgMS4xMCAyMDA1LzEwLzI2IDEyOjM2OjE4IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIF9fa2VybmVsX2NvcyggeCwgIHkgKQorICoga2VybmVsIGNvcyBmdW5jdGlvbiBvbiBbLXBpLzQsIHBpLzRdLCBwaS80IH4gMC43ODUzOTgxNjQKKyAqIElucHV0IHggaXMgYXNzdW1lZCB0byBiZSBib3VuZGVkIGJ5IH5waS80IGluIG1hZ25pdHVkZS4KKyAqIElucHV0IHkgaXMgdGhlIHRhaWwgb2YgeC4gCisgKgorICogQWxnb3JpdGhtCisgKgkxLiBTaW5jZSBjb3MoLXgpID0gY29zKHgpLCB3ZSBuZWVkIG9ubHkgdG8gY29uc2lkZXIgcG9zaXRpdmUgeC4KKyAqCTIuIGlmIHggPCAyXi0yNyAoaHg8MHgzZTQwMDAwMCAwKSwgcmV0dXJuIDEgd2l0aCBpbmV4YWN0IGlmIHghPTAuCisgKgkzLiBjb3MoeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgMTQgb24KKyAqCSAgIFswLHBpLzRdCisgKgkJICAJICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgMTQKKyAqCSAgIAljb3MoeCkgfiAxIC0geCp4LzIgKyBDMSp4ICsgLi4uICsgQzYqeAorICoJICAgd2hlcmUgdGhlIHJlbWV6IGVycm9yIGlzCisgKgkKKyAqIAl8ICAgICAgICAgICAgICAyICAgICA0ICAgICA2ICAgICA4ICAgICAxMCAgICAxMiAgICAgMTQgfCAgICAgLTU4CisgKiAJfGNvcyh4KS0oMS0uNSp4ICtDMSp4ICtDMip4ICtDMyp4ICtDNCp4ICtDNSp4ICArQzYqeCAgKXwgPD0gMgorICogCXwgICAgCQkJCQkgICAgICAgICAgICAgICB8IAorICogCisgKiAJICAgICAgICAgICAgICAgNCAgICAgNiAgICAgOCAgICAgMTAgICAgMTIgICAgIDE0IAorICoJNC4gbGV0IHIgPSBDMSp4ICtDMip4ICtDMyp4ICtDNCp4ICtDNSp4ICArQzYqeCAgLCB0aGVuCisgKgkgICAgICAgY29zKHgpIH4gMSAtIHgqeC8yICsgcgorICoJICAgc2luY2UgY29zKHgreSkgfiBjb3MoeCkgLSBzaW4oeCkqeSAKKyAqCQkJICB+IGNvcyh4KSAtIHgqeSwKKyAqCSAgIGEgY29ycmVjdGlvbiB0ZXJtIGlzIG5lY2Vzc2FyeSBpbiBjb3MoeCkgYW5kIGhlbmNlCisgKgkJY29zKHgreSkgPSAxIC0gKHgqeC8yIC0gKHIgLSB4KnkpKQorICoJICAgRm9yIGJldHRlciBhY2N1cmFjeSwgcmVhcnJhbmdlIHRvCisgKgkJY29zKHgreSkgfiB3ICsgKHRtcCArIChyLXgqeSkpCisgKgkgICB3aGVyZSB3ID0gMSAtIHgqeC8yIGFuZCB0bXAgaXMgYSB0aW55IGNvcnJlY3Rpb24gdGVybQorICoJICAgKDEgLSB4KngvMiA9PSB3ICsgdG1wIGV4YWN0bHkgaW4gaW5maW5pdGUgcHJlY2lzaW9uKS4KKyAqCSAgIFRoZSBleGFjdG5lc3Mgb2YgdyArIHRtcCBpbiBpbmZpbml0ZSBwcmVjaXNpb24gZGVwZW5kcyBvbiB3CisgKgkgICBhbmQgdG1wIGhhdmluZyB0aGUgc2FtZSBwcmVjaXNpb24gYXMgeC4gIElmIHRoZXkgaGF2ZSBleHRyYQorICoJICAgcHJlY2lzaW9uIGR1ZSB0byBjb21waWxlciBidWdzLCB0aGVuIHRoZSBleHRyYSBwcmVjaXNpb24gaXMKKyAqCSAgIG9ubHkgZ29vZCBwcm92aWRlZCBpdCBpcyByZXRhaW5lZCBpbiBhbGwgdGVybXMgb2YgdGhlIGZpbmFsCisgKgkgICBleHByZXNzaW9uIGZvciBjb3MoKS4gIFJldGVudGlvbiBoYXBwZW5zIGluIGFsbCBjYXNlcyB0ZXN0ZWQKKyAqCSAgIHVuZGVyIEZyZWVCU0QsIHNvIGRvbid0IHBlc3NpbWl6ZSB0aGluZ3MgYnkgZm9yY2libHkgY2xpcHBpbmcKKyAqCSAgIGFueSBleHRyYSBwcmVjaXNpb24gaW4gdy4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK0MxICA9ICA0LjE2NjY2NjY2NjY2NjY2MDE5MDM3ZS0wMiwgLyogMHgzRkE1NTU1NSwgMHg1NTU1NTU0QyAqLworQzIgID0gLTEuMzg4ODg4ODg4ODg3NDEwOTU3NDllLTAzLCAvKiAweEJGNTZDMTZDLCAweDE2QzE1MTc3ICovCitDMyAgPSAgMi40ODAxNTg3Mjg5NDc2NzI5NDE3OGUtMDUsIC8qIDB4M0VGQTAxQTAsIDB4MTlDQjE1OTAgKi8KK0M0ICA9IC0yLjc1NTczMTQzNTEzOTA2NjMzMDM1ZS0wNywgLyogMHhCRTkyN0U0RiwgMHg4MDlDNTJBRCAqLworQzUgID0gIDIuMDg3NTcyMzIxMjk4MTc0ODI3OTBlLTA5LCAvKiAweDNFMjFFRTlFLCAweEJEQjRCMUM0ICovCitDNiAgPSAtMS4xMzU5NjQ3NTU3Nzg4MTk0ODI2NWUtMTE7IC8qIDB4QkRBOEZBRTksIDB4QkU4ODM4RDQgKi8KKworZG91YmxlCitfX2tlcm5lbF9jb3MoZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBoeix6LHIsdzsKKworCXogID0geCp4OworCXIgID0geiooQzEreiooQzIreiooQzMreiooQzQreiooQzUreipDNikpKSkpOworCWh6ID0gKGZsb2F0KTAuNSp6OworCXcgID0gb25lLWh6OworCXJldHVybiB3ICsgKCgob25lLXcpLWh6KSArICh6KnIteCp5KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX2Nvc2YuYyBiL2xpYm0vc3JjL2tfY29zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDhkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX2Nvc2YuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBrX2Nvc2YuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIGtfY29zLmMKKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICogRGVidWdnZWQgYW5kIG9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9DT1NERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfY29zZi5jLHYgMS4xNSAyMDA1LzExLzMwIDExOjUxOjE3IGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8Y29zKHgpIC0gYyh4KXwgPCAyKiotMzQuMSAoflstNS4zN2UtMTEsIDUuMjk1ZS0xMV0pLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lID0gIDEuMCwKK0MwICA9IC0weDFmZmZmZmZkMGM1ZTgxLjBwLTU0LAkvKiAtMC40OTk5OTk5OTcyNTEwMzEwMDMxMjAgKi8KK0MxICA9ICAweDE1NTU1M2UxMDUzYTQyLjBwLTU3LAkvKiAgMC4wNDE2NjY2MjMzMjM3MzkwNjMxODk0ICovCitDMiAgPSAtMHgxNmMwODdlODBmMWUyNy4wcC02MiwJLyogLTAuMDAxMzg4Njc2Mzc3NDYwOTkyOTQ2OTIgKi8KK0MzICA9ICAweDE5OTM0MmUwZWU1MDY5LjBwLTY4OwkvKiAgMC4wMDAwMjQzOTA0NDg3OTYyNzc0MDkwNjU0ICovCisKKyNpZmRlZiBJTkxJTkVfS0VSTkVMX0NPU0RGCitleHRlcm4gaW5saW5lCisjZW5kaWYKK2Zsb2F0CitfX2tlcm5lbF9jb3NkZihkb3VibGUgeCkKK3sKKwlkb3VibGUgciwgdywgejsKKworCS8qIFRyeSB0byBvcHRpbWl6ZSBmb3IgcGFyYWxsZWwgZXZhbHVhdGlvbiBhcyBpbiBrX3RhbmYuYy4gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisJciA9IEMyK3oqQzM7CisJcmV0dXJuICgob25lK3oqQzApICsgdypDMSkgKyAodyp6KSpyOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19yZW1fcGlvMi5jIGIvbGlibS9zcmMva19yZW1fcGlvMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3JlbV9waW8yLmMKQEAgLTAsMCArMSwzMDQgQEAKKworLyogQCgjKWtfcmVtX3BpbzIuYyAxLjMgOTUvMDEvMTggKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Tb2Z0LCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMva19yZW1fcGlvMi5jLHYgMS43IDIwMDUvMDIvMDQgMTg6MjY6MDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogX19rZXJuZWxfcmVtX3BpbzIoeCx5LGUwLG54LHByZWMsaXBpbzIpCisgKiBkb3VibGUgeFtdLHlbXTsgaW50IGUwLG54LHByZWM7IGludCBpcGlvMltdOworICogCisgKiBfX2tlcm5lbF9yZW1fcGlvMiByZXR1cm4gdGhlIGxhc3QgdGhyZWUgZGlnaXRzIG9mIE4gd2l0aCAKKyAqCQl5ID0geCAtIE4qcGkvMgorICogc28gdGhhdCB8eXwgPCBwaS8yLgorICoKKyAqIFRoZSBtZXRob2QgaXMgdG8gY29tcHV0ZSB0aGUgaW50ZWdlciAobW9kIDgpIGFuZCBmcmFjdGlvbiBwYXJ0cyBvZiAKKyAqICgyL3BpKSp4IHdpdGhvdXQgZG9pbmcgdGhlIGZ1bGwgbXVsdGlwbGljYXRpb24uIEluIGdlbmVyYWwgd2UKKyAqIHNraXAgdGhlIHBhcnQgb2YgdGhlIHByb2R1Y3QgdGhhdCBhcmUga25vd24gdG8gYmUgYSBodWdlIGludGVnZXIgKAorICogbW9yZSBhY2N1cmF0ZWx5LCA9IDAgbW9kIDggKS4gVGh1cyB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgYXJlCisgKiBpbmRlcGVuZGVudCBvZiB0aGUgZXhwb25lbnQgb2YgdGhlIGlucHV0LgorICoKKyAqICgyL3BpKSBpcyByZXByZXNlbnRlZCBieSBhbiBhcnJheSBvZiAyNC1iaXQgaW50ZWdlcnMgaW4gaXBpbzJbXS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogCXhbXQlUaGUgaW5wdXQgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUpIGlzIGJyb2tlbiBpbnRvIG54IAorICoJCXBpZWNlcyBvZiAyNC1iaXQgaW50ZWdlcnMgaW4gZG91YmxlIHByZWNpc2lvbiBmb3JtYXQuCisgKgkJeFtpXSB3aWxsIGJlIHRoZSBpLXRoIDI0IGJpdCBvZiB4LiBUaGUgc2NhbGVkIGV4cG9uZW50IAorICoJCW9mIHhbMF0gaXMgZ2l2ZW4gaW4gaW5wdXQgcGFyYW1ldGVyIGUwIChpLmUuLCB4WzBdKjJeZTAgCisgKgkJbWF0Y2ggeCdzIHVwIHRvIDI0IGJpdHMuCisgKgorICoJCUV4YW1wbGUgb2YgYnJlYWtpbmcgYSBkb3VibGUgcG9zaXRpdmUgeiBpbnRvIHhbMF0reFsxXSt4WzJdOgorICoJCQllMCA9IGlsb2diKHopLTIzCisgKgkJCXogID0gc2NhbGJuKHosLWUwKQorICoJCWZvciBpID0gMCwxLDIKKyAqCQkJeFtpXSA9IGZsb29yKHopCisgKgkJCXogICAgPSAoei14W2ldKSoyKioyNAorICoKKyAqCisgKgl5W10Jb3VwdXQgcmVzdWx0IGluIGFuIGFycmF5IG9mIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVycy4KKyAqCQlUaGUgZGltZW5zaW9uIG9mIHlbXSBpczoKKyAqCQkJMjQtYml0ICBwcmVjaXNpb24JMQorICoJCQk1My1iaXQgIHByZWNpc2lvbgkyCisgKgkJCTY0LWJpdCAgcHJlY2lzaW9uCTIKKyAqCQkJMTEzLWJpdCBwcmVjaXNpb24JMworICoJCVRoZSBhY3R1YWwgdmFsdWUgaXMgdGhlIHN1bSBvZiB0aGVtLiBUaHVzIGZvciAxMTMtYml0CisgKgkJcHJlY2lzb24sIG9uZSBtYXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZToKKyAqCisgKgkJbG9uZyBkb3VibGUgdCx3LHJfaGVhZCwgcl90YWlsOworICoJCXQgPSAobG9uZyBkb3VibGUpeVsyXSArIChsb25nIGRvdWJsZSl5WzFdOworICoJCXcgPSAobG9uZyBkb3VibGUpeVswXTsKKyAqCQlyX2hlYWQgPSB0K3c7CisgKgkJcl90YWlsID0gdyAtIChyX2hlYWQgLSB0KTsKKyAqCisgKgllMAlUaGUgZXhwb25lbnQgb2YgeFswXQorICoKKyAqCW54CWRpbWVuc2lvbiBvZiB4W10KKyAqCisgKiAgCXByZWMJYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBwcmVjaXNpb246CisgKgkJCTAJMjQgIGJpdHMgKHNpbmdsZSkKKyAqCQkJMQk1MyAgYml0cyAoZG91YmxlKQorICoJCQkyCTY0ICBiaXRzIChleHRlbmRlZCkKKyAqCQkJMwkxMTMgYml0cyAocXVhZCkKKyAqCisgKglpcGlvMltdCisgKgkJaW50ZWdlciBhcnJheSwgY29udGFpbnMgdGhlICgyNCppKS10aCB0byAoMjQqaSsyMyktdGggCisgKgkJYml0IG9mIDIvcGkgYWZ0ZXIgYmluYXJ5IHBvaW50LiBUaGUgY29ycmVzcG9uZGluZyAKKyAqCQlmbG9hdGluZyB2YWx1ZSBpcworICoKKyAqCQkJaXBpbzJbaV0gKiAyXigtMjQoaSsxKSkuCisgKgorICogRXh0ZXJuYWwgZnVuY3Rpb246CisgKglkb3VibGUgc2NhbGJuKCksIGZsb29yKCk7CisgKgorICoKKyAqIEhlcmUgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHNvbWUgbG9jYWwgdmFyaWFibGVzOgorICoKKyAqIAlqawlqaysxIGlzIHRoZSBpbml0aWFsIG51bWJlciBvZiB0ZXJtcyBvZiBpcGlvMltdIG5lZWRlZAorICoJCWluIHRoZSBjb21wdXRhdGlvbi4gVGhlIHJlY29tbWVuZGVkIHZhbHVlIGlzIDIsMyw0LAorICoJCTYgZm9yIHNpbmdsZSwgZG91YmxlLCBleHRlbmRlZCxhbmQgcXVhZC4KKyAqCisgKiAJanoJbG9jYWwgaW50ZWdlciB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgCisgKgkJdGVybXMgb2YgaXBpbzJbXSB1c2VkLiAKKyAqCisgKglqeAlueCAtIDEKKyAqCisgKglqdglpbmRleCBmb3IgcG9pbnRpbmcgdG8gdGhlIHN1aXRhYmxlIGlwaW8yW10gZm9yIHRoZQorICoJCWNvbXB1dGF0aW9uLiBJbiBnZW5lcmFsLCB3ZSB3YW50CisgKgkJCSggMl5lMCp4WzBdICogaXBpbzJbanYtMV0qMl4oLTI0anYpICkvOAorICoJCWlzIGFuIGludGVnZXIuIFRodXMKKyAqCQkJZTAtMy0yNCpqdiA+PSAwIG9yIChlMC0zKS8yNCA+PSBqdgorICoJCUhlbmNlIGp2ID0gbWF4KDAsKGUwLTMpLzI0KS4KKyAqCisgKglqcAlqcCsxIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgaW4gUElvMltdIG5lZWRlZCwganAgPSBqay4KKyAqCisgKiAJcVtdCWRvdWJsZSBhcnJheSB3aXRoIGludGVncmFsIHZhbHVlLCByZXByZXNlbnRpbmcgdGhlCisgKgkJMjQtYml0cyBjaHVuayBvZiB0aGUgcHJvZHVjdCBvZiB4IGFuZCAyL3BpLgorICoKKyAqCXEwCXRoZSBjb3JyZXNwb25kaW5nIGV4cG9uZW50IG9mIHFbMF0uIE5vdGUgdGhhdCB0aGUKKyAqCQlleHBvbmVudCBmb3IgcVtpXSB3b3VsZCBiZSBxMC0yNCppLgorICoKKyAqCVBJbzJbXQlkb3VibGUgcHJlY2lzaW9uIGFycmF5LCBvYnRhaW5lZCBieSBjdXR0aW5nIHBpLzIKKyAqCQlpbnRvIDI0IGJpdHMgY2h1bmtzLiAKKyAqCisgKglmW10JaXBpbzJbXSBpbiBmbG9hdGluZyBwb2ludCAKKyAqCisgKglpcVtdCWludGVnZXIgYXJyYXkgYnkgYnJlYWtpbmcgdXAgcVtdIGluIDI0LWJpdHMgY2h1bmsuCisgKgorICoJZnFbXQlmaW5hbCBwcm9kdWN0IG9mIHgqKDIvcGkpIGluIGZxWzBdLC4uLGZxW2prXQorICoKKyAqCWloCWludGVnZXIuIElmID4wIGl0IGluZGljYXRlcyBxW10gaXMgPj0gMC41LCBoZW5jZQorICoJCWl0IGFsc28gaW5kaWNhdGVzIHRoZSAqc2lnbiogb2YgdGhlIHJlc3VsdC4KKyAqCisgKi8KKworCisvKgorICogQ29uc3RhbnRzOgorICogVGhlIGhleGFkZWNpbWFsIHZhbHVlcyBhcmUgdGhlIGludGVuZGVkIG9uZXMgZm9yIHRoZSBmb2xsb3dpbmcgCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUgCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaCAKKyAqIHRvIHByb2R1Y2UgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBzaG93bi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgaW50IGluaXRfamtbXSA9IHsyLDMsNCw2fTsgLyogaW5pdGlhbCB2YWx1ZSBmb3IgamsgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZSBQSW8yW10gPSB7CisgIDEuNTcwNzk2MjUxMjk2OTk3MDcwMzFlKzAwLCAvKiAweDNGRjkyMUZCLCAweDQwMDAwMDAwICovCisgIDcuNTQ5Nzg5NDE1ODYxNTk2MzUzMzVlLTA4LCAvKiAweDNFNzQ0NDJELCAweDAwMDAwMDAwICovCisgIDUuMzkwMzAyNTI5OTU3NzY0NzY1NTRlLTE1LCAvKiAweDNDRjg0Njk4LCAweDgwMDAwMDAwICovCisgIDMuMjgyMDAzNDE1ODA3OTEyOTQxMjNlLTIyLCAvKiAweDNCNzhDQzUxLCAweDYwMDAwMDAwICovCisgIDEuMjcwNjU1NzUzMDgwNjc2MDczNDllLTI5LCAvKiAweDM5RjAxQjgzLCAweDgwMDAwMDAwICovCisgIDEuMjI5MzMzMDg5ODExMTEzMjg5MzJlLTM2LCAvKiAweDM4N0EyNTIwLCAweDQwMDAwMDAwICovCisgIDIuNzMzNzAwNTM4MTY0NjQ1NTk2MjRlLTQ0LCAvKiAweDM2RTM4MjIyLCAweDgwMDAwMDAwICovCisgIDIuMTY3NDE2ODM4Nzc4MDQ4MTk0NDRlLTUxLCAvKiAweDM1NjlGMzFELCAweDAwMDAwMDAwICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlCQkJCit6ZXJvICAgPSAwLjAsCitvbmUgICAgPSAxLjAsCit0d28yNCAgID0gIDEuNjc3NzIxNjAwMDAwMDAwMDAwMDBlKzA3LCAvKiAweDQxNzAwMDAwLCAweDAwMDAwMDAwICovCit0d29uMjQgID0gIDUuOTYwNDY0NDc3NTM5MDYyNTAwMDBlLTA4OyAvKiAweDNFNzAwMDAwLCAweDAwMDAwMDAwICovCisKKwlpbnQgX19rZXJuZWxfcmVtX3BpbzIoZG91YmxlICp4LCBkb3VibGUgKnksIGludCBlMCwgaW50IG54LCBpbnQgcHJlYywgY29uc3QgaW50MzJfdCAqaXBpbzIpCit7CisJaW50MzJfdCBqeixqeCxqdixqcCxqayxjYXJyeSxuLGlxWzIwXSxpLGosayxtLHEwLGloOworCWRvdWJsZSB6LGZ3LGZbMjBdLGZxWzIwXSxxWzIwXTsKKworICAgIC8qIGluaXRpYWxpemUgamsqLworCWprID0gaW5pdF9qa1twcmVjXTsKKwlqcCA9IGprOworCisgICAgLyogZGV0ZXJtaW5lIGp4LGp2LHEwLCBub3RlIHRoYXQgMz5xMCAqLworCWp4ID0gIG54LTE7CisJanYgPSAoZTAtMykvMjQ7IGlmKGp2PDApIGp2PTA7CisJcTAgPSAgZTAtMjQqKGp2KzEpOworCisgICAgLyogc2V0IHVwIGZbMF0gdG8gZltqeCtqa10gd2hlcmUgZltqeCtqa10gPSBpcGlvMltqditqa10gKi8KKwlqID0ganYtang7IG0gPSBqeCtqazsKKwlmb3IoaT0wO2k8PW07aSsrLGorKykgZltpXSA9IChqPDApPyB6ZXJvIDogKGRvdWJsZSkgaXBpbzJbal07CisKKyAgICAvKiBjb21wdXRlIHFbMF0scVsxXSwuLi5xW2prXSAqLworCWZvciAoaT0wO2k8PWprO2krKykgeworCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOyBxW2ldID0gZnc7CisJfQorCisJanogPSBqazsKK3JlY29tcHV0ZToKKyAgICAvKiBkaXN0aWxsIHFbXSBpbnRvIGlxW10gcmV2ZXJzaW5nbHkgKi8KKwlmb3IoaT0wLGo9anosej1xW2p6XTtqPjA7aSsrLGotLSkgeworCSAgICBmdyAgICA9ICAoZG91YmxlKSgoaW50MzJfdCkodHdvbjI0KiB6KSk7CisJICAgIGlxW2ldID0gIChpbnQzMl90KSh6LXR3bzI0KmZ3KTsKKwkgICAgeiAgICAgPSAgcVtqLTFdK2Z3OworCX0KKworICAgIC8qIGNvbXB1dGUgbiAqLworCXogID0gc2NhbGJuKHoscTApOwkJLyogYWN0dWFsIHZhbHVlIG9mIHogKi8KKwl6IC09IDguMCpmbG9vcih6KjAuMTI1KTsJCS8qIHRyaW0gb2ZmIGludGVnZXIgPj0gOCAqLworCW4gID0gKGludDMyX3QpIHo7CisJeiAtPSAoZG91YmxlKW47CisJaWggPSAwOworCWlmKHEwPjApIHsJLyogbmVlZCBpcVtqei0xXSB0byBkZXRlcm1pbmUgbiAqLworCSAgICBpICA9IChpcVtqei0xXT4+KDI0LXEwKSk7IG4gKz0gaTsKKwkgICAgaXFbanotMV0gLT0gaTw8KDI0LXEwKTsKKwkgICAgaWggPSBpcVtqei0xXT4+KDIzLXEwKTsKKwl9IAorCWVsc2UgaWYocTA9PTApIGloID0gaXFbanotMV0+PjIzOworCWVsc2UgaWYoej49MC41KSBpaD0yOworCisJaWYoaWg+MCkgewkvKiBxID4gMC41ICovCisJICAgIG4gKz0gMTsgY2FycnkgPSAwOworCSAgICBmb3IoaT0wO2k8anogO2krKykgewkvKiBjb21wdXRlIDEtcSAqLworCQlqID0gaXFbaV07CisJCWlmKGNhcnJ5PT0wKSB7CisJCSAgICBpZihqIT0wKSB7CisJCQljYXJyeSA9IDE7IGlxW2ldID0gMHgxMDAwMDAwLSBqOworCQkgICAgfQorCQl9IGVsc2UgIGlxW2ldID0gMHhmZmZmZmYgLSBqOworCSAgICB9CisJICAgIGlmKHEwPjApIHsJCS8qIHJhcmUgY2FzZTogY2hhbmNlIGlzIDEgaW4gMTIgKi8KKwkgICAgICAgIHN3aXRjaChxMCkgeworCSAgICAgICAgY2FzZSAxOgorCSAgICAJICAgaXFbanotMV0gJj0gMHg3ZmZmZmY7IGJyZWFrOworCSAgICAJY2FzZSAyOgorCSAgICAJICAgaXFbanotMV0gJj0gMHgzZmZmZmY7IGJyZWFrOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGlmKGloPT0yKSB7CisJCXogPSBvbmUgLSB6OworCQlpZihjYXJyeSE9MCkgeiAtPSBzY2FsYm4ob25lLHEwKTsKKwkgICAgfQorCX0KKworICAgIC8qIGNoZWNrIGlmIHJlY29tcHV0YXRpb24gaXMgbmVlZGVkICovCisJaWYoej09emVybykgeworCSAgICBqID0gMDsKKwkgICAgZm9yIChpPWp6LTE7aT49ams7aS0tKSBqIHw9IGlxW2ldOworCSAgICBpZihqPT0wKSB7IC8qIG5lZWQgcmVjb21wdXRhdGlvbiAqLworCQlmb3Ioaz0xO2lxW2prLWtdPT0wO2srKyk7ICAgLyogayA9IG5vLiBvZiB0ZXJtcyBuZWVkZWQgKi8KKworCQlmb3IoaT1qeisxO2k8PWp6K2s7aSsrKSB7ICAgLyogYWRkIHFbanorMV0gdG8gcVtqeitrXSAqLworCQkgICAgZltqeCtpXSA9IChkb3VibGUpIGlwaW8yW2p2K2ldOworCQkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsKKwkJICAgIHFbaV0gPSBmdzsKKwkJfQorCQlqeiArPSBrOworCQlnb3RvIHJlY29tcHV0ZTsKKwkgICAgfQorCX0KKworICAgIC8qIGNob3Agb2ZmIHplcm8gdGVybXMgKi8KKwlpZih6PT0wLjApIHsKKwkgICAganogLT0gMTsgcTAgLT0gMjQ7CisJICAgIHdoaWxlKGlxW2p6XT09MCkgeyBqei0tOyBxMC09MjQ7fQorCX0gZWxzZSB7IC8qIGJyZWFrIHogaW50byAyNC1iaXQgaWYgbmVjZXNzYXJ5ICovCisJICAgIHogPSBzY2FsYm4oeiwtcTApOworCSAgICBpZih6Pj10d28yNCkgeyAKKwkJZncgPSAoZG91YmxlKSgoaW50MzJfdCkodHdvbjI0KnopKTsKKwkJaXFbanpdID0gKGludDMyX3QpKHotdHdvMjQqZncpOworCQlqeiArPSAxOyBxMCArPSAyNDsKKwkJaXFbanpdID0gKGludDMyX3QpIGZ3OworCSAgICB9IGVsc2UgaXFbanpdID0gKGludDMyX3QpIHogOworCX0KKworICAgIC8qIGNvbnZlcnQgaW50ZWdlciAiYml0IiBjaHVuayB0byBmbG9hdGluZy1wb2ludCB2YWx1ZSAqLworCWZ3ID0gc2NhbGJuKG9uZSxxMCk7CisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgcVtpXSA9IGZ3Kihkb3VibGUpaXFbaV07IGZ3Kj10d29uMjQ7CisJfQorCisgICAgLyogY29tcHV0ZSBQSW8yWzAsLi4uLGpwXSpxW2p6LC4uLiwwXSAqLworCWZvcihpPWp6O2k+PTA7aS0tKSB7CisJICAgIGZvcihmdz0wLjAsaz0wO2s8PWpwJiZrPD1qei1pO2srKykgZncgKz0gUElvMltrXSpxW2kra107CisJICAgIGZxW2p6LWldID0gZnc7CisJfQorCisgICAgLyogY29tcHJlc3MgZnFbXSBpbnRvIHlbXSAqLworCXN3aXRjaChwcmVjKSB7CisJICAgIGNhc2UgMDoKKwkJZncgPSAwLjA7CisJCWZvciAoaT1qejtpPj0wO2ktLSkgZncgKz0gZnFbaV07CisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OyAKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsgCisJCXlbMF0gPSAoaWg9PTApPyBmdzogLWZ3OyAKKwkJZncgPSBmcVswXS1mdzsKKwkJZm9yIChpPTE7aTw9ano7aSsrKSBmdyArPSBmcVtpXTsKKwkJeVsxXSA9IChpaD09MCk/IGZ3OiAtZnc7IAorCQlicmVhazsKKwkgICAgY2FzZSAzOgkvKiBwYWluZnVsICovCisJCWZvciAoaT1qejtpPjA7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsgCisJCSAgICBmcVtpXSAgKz0gZnFbaS0xXS1mdzsKKwkJICAgIGZxW2ktMV0gPSBmdzsKKwkJfQorCQlmb3IgKGk9ano7aT4xO2ktLSkgeworCQkgICAgZncgICAgICA9IGZxW2ktMV0rZnFbaV07IAorCQkgICAgZnFbaV0gICs9IGZxW2ktMV0tZnc7CisJCSAgICBmcVtpLTFdID0gZnc7CisJCX0KKwkJZm9yIChmdz0wLjAsaT1qejtpPj0yO2ktLSkgZncgKz0gZnFbaV07IAorCQlpZihpaD09MCkgeworCQkgICAgeVswXSA9ICBmcVswXTsgeVsxXSA9ICBmcVsxXTsgeVsyXSA9ICBmdzsKKwkJfSBlbHNlIHsKKwkJICAgIHlbMF0gPSAtZnFbMF07IHlbMV0gPSAtZnFbMV07IHlbMl0gPSAtZnc7CisJCX0KKwl9CisJcmV0dXJuIG4mNzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfcmVtX3BpbzJmLmMgYi9saWJtL3NyYy9rX3JlbV9waW8yZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzI4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3JlbV9waW8yZi5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiBrX3JlbV9waW8yZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Yga19yZW1fcGlvMi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3JlbV9waW8yZi5jLHYgMS44IDIwMDUvMTAvMTEgMDc6NTY6MDUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiBJbiB0aGUgZmxvYXQgdmVyc2lvbiwgdGhlIGlucHV0IHBhcmFtZXRlciB4IGNvbnRhaW5zIDggYml0CisgICBpbnRlZ2Vycywgbm90IDI0IGJpdCBpbnRlZ2Vycy4gIDExMyBiaXQgcHJlY2lzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuICAqLworCitzdGF0aWMgY29uc3QgaW50IGluaXRfamtbXSA9IHs0LDcsOX07IC8qIGluaXRpYWwgdmFsdWUgZm9yIGprICovCisKK3N0YXRpYyBjb25zdCBmbG9hdCBQSW8yW10gPSB7CisgIDEuNTcwMzEyNTAwMGUrMDAsIC8qIDB4M2ZjOTAwMDAgKi8KKyAgNC41Nzc2MzY3MTg4ZS0wNCwgLyogMHgzOWYwMDAwMCAqLworICAyLjU5ODc2MjUxMjJlLTA1LCAvKiAweDM3ZGEwMDAwICovCisgIDcuNTQzNzEyODU0NGUtMDgsIC8qIDB4MzNhMjAwMDAgKi8KKyAgNi4wMDI2NjUwMzE3ZS0xMSwgLyogMHgyZTg0MDAwMCAqLworICA3LjM4OTY0NDQ1MTllLTEzLCAvKiAweDJiNTAwMDAwICovCisgIDUuMzg0NTgxNjY5NGUtMTUsIC8qIDB4MjdjMjAwMDAgKi8KKyAgNS42Mzc4NTEyOTY5ZS0xOCwgLyogMHgyMmQwMDAwMCAqLworICA4LjMwMDkyMjg4MzFlLTIwLCAvKiAweDFmYzQwMDAwICovCisgIDMuMjc1NjM1MjI1N2UtMjIsIC8qIDB4MWJjNjAwMDAgKi8KKyAgNi4zMzMxMDE1NjQ5ZS0yNSwgLyogMHgxNzQ0MDAwMCAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0Cit6ZXJvICAgPSAwLjAsCitvbmUgICAgPSAxLjAsCit0d284ICAgPSAgMi41NjAwMDAwMDAwZSswMiwgLyogMHg0MzgwMDAwMCAqLwordHdvbjggID0gIDMuOTA2MjUwMDAwMGUtMDM7IC8qIDB4M2I4MDAwMDAgKi8KKworCWludCBfX2tlcm5lbF9yZW1fcGlvMmYoZmxvYXQgKngsIGZsb2F0ICp5LCBpbnQgZTAsIGludCBueCwgaW50IHByZWMsIGNvbnN0IGludDMyX3QgKmlwaW8yKQoreworCWludDMyX3QganosangsanYsanAsamssY2FycnksbixpcVsyMF0saSxqLGssbSxxMCxpaDsKKwlmbG9hdCB6LGZ3LGZbMjBdLGZxWzIwXSxxWzIwXTsKKworICAgIC8qIGluaXRpYWxpemUgamsqLworCWprID0gaW5pdF9qa1twcmVjXTsKKwlqcCA9IGprOworCisgICAgLyogZGV0ZXJtaW5lIGp4LGp2LHEwLCBub3RlIHRoYXQgMz5xMCAqLworCWp4ID0gIG54LTE7CisJanYgPSAoZTAtMykvODsgaWYoanY8MCkganY9MDsKKwlxMCA9ICBlMC04KihqdisxKTsKKworICAgIC8qIHNldCB1cCBmWzBdIHRvIGZbangramtdIHdoZXJlIGZbangramtdID0gaXBpbzJbanYramtdICovCisJaiA9IGp2LWp4OyBtID0gangrams7CisJZm9yKGk9MDtpPD1tO2krKyxqKyspIGZbaV0gPSAoajwwKT8gemVybyA6IChmbG9hdCkgaXBpbzJbal07CisKKyAgICAvKiBjb21wdXRlIHFbMF0scVsxXSwuLi5xW2prXSAqLworCWZvciAoaT0wO2k8PWprO2krKykgeworCSAgICBmb3Ioaj0wLGZ3PTAuMDtqPD1qeDtqKyspIGZ3ICs9IHhbal0qZltqeCtpLWpdOyBxW2ldID0gZnc7CisJfQorCisJanogPSBqazsKK3JlY29tcHV0ZToKKyAgICAvKiBkaXN0aWxsIHFbXSBpbnRvIGlxW10gcmV2ZXJzaW5nbHkgKi8KKwlmb3IoaT0wLGo9anosej1xW2p6XTtqPjA7aSsrLGotLSkgeworCSAgICBmdyAgICA9ICAoZmxvYXQpKChpbnQzMl90KSh0d29uOCogeikpOworCSAgICBpcVtpXSA9ICAoaW50MzJfdCkoei10d284KmZ3KTsKKwkgICAgeiAgICAgPSAgcVtqLTFdK2Z3OworCX0KKworICAgIC8qIGNvbXB1dGUgbiAqLworCXogID0gc2NhbGJuZih6LHEwKTsJCS8qIGFjdHVhbCB2YWx1ZSBvZiB6ICovCisJeiAtPSAoZmxvYXQpOC4wKmZsb29yZih6KihmbG9hdCkwLjEyNSk7CS8qIHRyaW0gb2ZmIGludGVnZXIgPj0gOCAqLworCW4gID0gKGludDMyX3QpIHo7CisJeiAtPSAoZmxvYXQpbjsKKwlpaCA9IDA7CisJaWYocTA+MCkgewkvKiBuZWVkIGlxW2p6LTFdIHRvIGRldGVybWluZSBuICovCisJICAgIGkgID0gKGlxW2p6LTFdPj4oOC1xMCkpOyBuICs9IGk7CisJICAgIGlxW2p6LTFdIC09IGk8PCg4LXEwKTsKKwkgICAgaWggPSBpcVtqei0xXT4+KDctcTApOworCX0KKwllbHNlIGlmKHEwPT0wKSBpaCA9IGlxW2p6LTFdPj43OworCWVsc2UgaWYoej49KGZsb2F0KTAuNSkgaWg9MjsKKworCWlmKGloPjApIHsJLyogcSA+IDAuNSAqLworCSAgICBuICs9IDE7IGNhcnJ5ID0gMDsKKwkgICAgZm9yKGk9MDtpPGp6IDtpKyspIHsJLyogY29tcHV0ZSAxLXEgKi8KKwkJaiA9IGlxW2ldOworCQlpZihjYXJyeT09MCkgeworCQkgICAgaWYoaiE9MCkgeworCQkJY2FycnkgPSAxOyBpcVtpXSA9IDB4MTAwLSBqOworCQkgICAgfQorCQl9IGVsc2UgIGlxW2ldID0gMHhmZiAtIGo7CisJICAgIH0KKwkgICAgaWYocTA+MCkgewkJLyogcmFyZSBjYXNlOiBjaGFuY2UgaXMgMSBpbiAxMiAqLworCSAgICAgICAgc3dpdGNoKHEwKSB7CisJICAgICAgICBjYXNlIDE6CisJICAgIAkgICBpcVtqei0xXSAmPSAweDdmOyBicmVhazsKKwkgICAgCWNhc2UgMjoKKwkgICAgCSAgIGlxW2p6LTFdICY9IDB4M2Y7IGJyZWFrOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGlmKGloPT0yKSB7CisJCXogPSBvbmUgLSB6OworCQlpZihjYXJyeSE9MCkgeiAtPSBzY2FsYm5mKG9uZSxxMCk7CisJICAgIH0KKwl9CisKKyAgICAvKiBjaGVjayBpZiByZWNvbXB1dGF0aW9uIGlzIG5lZWRlZCAqLworCWlmKHo9PXplcm8pIHsKKwkgICAgaiA9IDA7CisJICAgIGZvciAoaT1qei0xO2k+PWprO2ktLSkgaiB8PSBpcVtpXTsKKwkgICAgaWYoaj09MCkgeyAvKiBuZWVkIHJlY29tcHV0YXRpb24gKi8KKwkJZm9yKGs9MTtpcVtqay1rXT09MDtrKyspOyAgIC8qIGsgPSBuby4gb2YgdGVybXMgbmVlZGVkICovCisKKwkJZm9yKGk9anorMTtpPD1qeitrO2krKykgeyAgIC8qIGFkZCBxW2p6KzFdIHRvIHFbanora10gKi8KKwkJICAgIGZbangraV0gPSAoZmxvYXQpIGlwaW8yW2p2K2ldOworCQkgICAgZm9yKGo9MCxmdz0wLjA7ajw9ang7aisrKSBmdyArPSB4W2pdKmZbangraS1qXTsKKwkJICAgIHFbaV0gPSBmdzsKKwkJfQorCQlqeiArPSBrOworCQlnb3RvIHJlY29tcHV0ZTsKKwkgICAgfQorCX0KKworICAgIC8qIGNob3Agb2ZmIHplcm8gdGVybXMgKi8KKwlpZih6PT0oZmxvYXQpMC4wKSB7CisJICAgIGp6IC09IDE7IHEwIC09IDg7CisJICAgIHdoaWxlKGlxW2p6XT09MCkgeyBqei0tOyBxMC09ODt9CisJfSBlbHNlIHsgLyogYnJlYWsgeiBpbnRvIDgtYml0IGlmIG5lY2Vzc2FyeSAqLworCSAgICB6ID0gc2NhbGJuZih6LC1xMCk7CisJICAgIGlmKHo+PXR3bzgpIHsKKwkJZncgPSAoZmxvYXQpKChpbnQzMl90KSh0d29uOCp6KSk7CisJCWlxW2p6XSA9IChpbnQzMl90KSh6LXR3bzgqZncpOworCQlqeiArPSAxOyBxMCArPSA4OworCQlpcVtqel0gPSAoaW50MzJfdCkgZnc7CisJICAgIH0gZWxzZSBpcVtqel0gPSAoaW50MzJfdCkgeiA7CisJfQorCisgICAgLyogY29udmVydCBpbnRlZ2VyICJiaXQiIGNodW5rIHRvIGZsb2F0aW5nLXBvaW50IHZhbHVlICovCisJZncgPSBzY2FsYm5mKG9uZSxxMCk7CisJZm9yKGk9ano7aT49MDtpLS0pIHsKKwkgICAgcVtpXSA9IGZ3KihmbG9hdClpcVtpXTsgZncqPXR3b244OworCX0KKworICAgIC8qIGNvbXB1dGUgUElvMlswLC4uLixqcF0qcVtqeiwuLi4sMF0gKi8KKwlmb3IoaT1qejtpPj0wO2ktLSkgeworCSAgICBmb3IoZnc9MC4wLGs9MDtrPD1qcCYmazw9anotaTtrKyspIGZ3ICs9IFBJbzJba10qcVtpK2tdOworCSAgICBmcVtqei1pXSA9IGZ3OworCX0KKworICAgIC8qIGNvbXByZXNzIGZxW10gaW50byB5W10gKi8KKwlzd2l0Y2gocHJlYykgeworCSAgICBjYXNlIDA6CisJCWZ3ID0gMC4wOworCQlmb3IgKGk9ano7aT49MDtpLS0pIGZ3ICs9IGZxW2ldOworCQl5WzBdID0gKGloPT0wKT8gZnc6IC1mdzsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOgorCQlmdyA9IDAuMDsKKwkJZm9yIChpPWp6O2k+PTA7aS0tKSBmdyArPSBmcVtpXTsKKwkJZncgPSAqKHZvbGF0aWxlIGZsb2F0ICopJmZ3OwkvKiBjbGlwIGFueSBleHRyYSBwcmVjaXNpb24gKi8KKwkJeVswXSA9IChpaD09MCk/IGZ3OiAtZnc7CisJCWZ3ID0gZnFbMF0tZnc7CisJCWZvciAoaT0xO2k8PWp6O2krKykgZncgKz0gZnFbaV07CisJCXlbMV0gPSAoaWg9PTApPyBmdzogLWZ3OworCQlicmVhazsKKwkgICAgY2FzZSAzOgkvKiBwYWluZnVsICovCisJCWZvciAoaT1qejtpPjA7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoaT1qejtpPjE7aS0tKSB7CisJCSAgICBmdyAgICAgID0gZnFbaS0xXStmcVtpXTsKKwkJICAgIGZxW2ldICArPSBmcVtpLTFdLWZ3OworCQkgICAgZnFbaS0xXSA9IGZ3OworCQl9CisJCWZvciAoZnc9MC4wLGk9ano7aT49MjtpLS0pIGZ3ICs9IGZxW2ldOworCQlpZihpaD09MCkgeworCQkgICAgeVswXSA9ICBmcVswXTsgeVsxXSA9ICBmcVsxXTsgeVsyXSA9ICBmdzsKKwkJfSBlbHNlIHsKKwkJICAgIHlbMF0gPSAtZnFbMF07IHlbMV0gPSAtZnFbMV07IHlbMl0gPSAtZnc7CisJCX0KKwl9CisJcmV0dXJuIG4mNzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL2tfc2luLmMgYi9saWJtL3NyYy9rX3Npbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDZhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9rX3Npbi5jCkBAIC0wLDAgKzEsNzAgQEAKKworLyogQCgjKWtfc2luLmMgMS4zIDk1LzAxLzE4ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfc2luLmMsdiAxLjEwIDIwMDUvMTEvMDIgMTM6MDY6NDkgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBfX2tlcm5lbF9zaW4oIHgsIHksIGl5KQorICoga2VybmVsIHNpbiBmdW5jdGlvbiBvbiB+Wy1waS80LCBwaS80XSAoZXhjZXB0IG9uIC0wKSwgcGkvNCB+IDAuNzg1NAorICogSW5wdXQgeCBpcyBhc3N1bWVkIHRvIGJlIGJvdW5kZWQgYnkgfnBpLzQgaW4gbWFnbml0dWRlLgorICogSW5wdXQgeSBpcyB0aGUgdGFpbCBvZiB4LgorICogSW5wdXQgaXkgaW5kaWNhdGVzIHdoZXRoZXIgeSBpcyAwLiAoaWYgaXk9MCwgeSBhc3N1bWUgdG8gYmUgMCkuIAorICoKKyAqIEFsZ29yaXRobQorICoJMS4gU2luY2Ugc2luKC14KSA9IC1zaW4oeCksIHdlIG5lZWQgb25seSB0byBjb25zaWRlciBwb3NpdGl2ZSB4LiAKKyAqCTIuIENhbGxlcnMgbXVzdCByZXR1cm4gc2luKC0wKSA9IC0wIHdpdGhvdXQgY2FsbGluZyBoZXJlIHNpbmNlIG91cgorICoJICAgb2RkIHBvbHlub21pYWwgaXMgbm90IGV2YWx1YXRlZCBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyAtMC4KKyAqCSAgIENhbGxlcnMgbWF5IGRvIHRoZSBvcHRpbWl6YXRpb24gc2luKHgpIH4geCBmb3IgdGlueSB4LgorICoJMy4gc2luKHgpIGlzIGFwcHJveGltYXRlZCBieSBhIHBvbHlub21pYWwgb2YgZGVncmVlIDEzIG9uCisgKgkgICBbMCxwaS80XQorICoJCSAgCSAgICAgICAgIDMgICAgICAgICAgICAxMworICoJICAgCXNpbih4KSB+IHggKyBTMSp4ICsgLi4uICsgUzYqeAorICoJICAgd2hlcmUKKyAqCQorICogCXxzaW4oeCkgICAgICAgICAyICAgICA0ICAgICA2ICAgICA4ICAgICAxMCAgICAgMTIgIHwgICAgIC01OAorICogCXwtLS0tLSAtICgxK1MxKnggK1MyKnggK1MzKnggK1M0KnggK1M1KnggICtTNip4ICAgKXwgPD0gMgorICogCXwgIHggCQkJCQkgICAgICAgICAgIHwgCisgKiAKKyAqCTQuIHNpbih4K3kpID0gc2luKHgpICsgc2luJyh4JykqeQorICoJCSAgICB+IHNpbih4KSArICgxLXgqeC8yKSp5CisgKgkgICBGb3IgYmV0dGVyIGFjY3VyYWN5LCBsZXQgCisgKgkJICAgICAzICAgICAgMiAgICAgIDIgICAgICAyICAgICAgMgorICoJCXIgPSB4ICooUzIreCAqKFMzK3ggKihTNCt4ICooUzUreCAqUzYpKSkpCisgKgkgICB0aGVuICAgICAgICAgICAgICAgICAgIDMgICAgMgorICoJCXNpbih4KSA9IHggKyAoUzEqeCArICh4ICooci15LzIpK3kpKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK2hhbGYgPSAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUtMDEsIC8qIDB4M0ZFMDAwMDAsIDB4MDAwMDAwMDAgKi8KK1MxICA9IC0xLjY2NjY2NjY2NjY2NjY2MzI0MzQ4ZS0wMSwgLyogMHhCRkM1NTU1NSwgMHg1NTU1NTU0OSAqLworUzIgID0gIDguMzMzMzMzMzMzMzIyNDg5NDYxMjRlLTAzLCAvKiAweDNGODExMTExLCAweDExMTBGOEE2ICovCitTMyAgPSAtMS45ODQxMjY5ODI5ODU3OTQ5MzEzNGUtMDQsIC8qIDB4QkYyQTAxQTAsIDB4MTlDMTYxRDUgKi8KK1M0ICA9ICAyLjc1NTczMTM3MDcwNzAwNjc2Nzg5ZS0wNiwgLyogMHgzRUM3MURFMywgMHg1N0IxRkU3RCAqLworUzUgID0gLTIuNTA1MDc2MDI1MzQwNjg2MzQxOTVlLTA4LCAvKiAweEJFNUFFNUU2LCAweDhBMkI5Q0VCICovCitTNiAgPSAgMS41ODk2OTA5OTUyMTE1NTAxMDIyMWUtMTA7IC8qIDB4M0RFNUQ5M0EsIDB4NUFDRkQ1N0MgKi8KKworZG91YmxlCitfX2tlcm5lbF9zaW4oZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgaXkpCit7CisJZG91YmxlIHoscix2OworCisJegk9ICB4Kng7CisJdgk9ICB6Kng7CisJcgk9ICBTMit6KihTMyt6KihTNCt6KihTNSt6KlM2KSkpOworCWlmKGl5PT0wKSByZXR1cm4geCt2KihTMSt6KnIpOworCWVsc2UgICAgICByZXR1cm4geC0oKHoqKGhhbGYqeS12KnIpLXkpLXYqUzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva19zaW5mLmMgYi9saWJtL3NyYy9rX3NpbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVkYzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva19zaW5mLmMKQEAgLTAsMCArMSw0NyBAQAorLyoga19zaW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX3Npbi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9TSU5ERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfc2luZi5jLHYgMS4xMyAyMDA1LzExLzMwIDExOjUxOjE3IGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8c2luKHgpL3ggLSBzKHgpfCA8IDIqKi0zNy41ICh+Wy00Ljg5ZS0xMiwgNC44MjRlLTEyXSkuICovCitzdGF0aWMgY29uc3QgZG91YmxlCitTMSA9IC0weDE1NTU1NTU0Y2JhYzc3LjBwLTU1LAkvKiAtMC4xNjY2NjY2NjY0MTYyNjUyMzU1OTUgKi8KK1MyID0gIDB4MTExMTEwODk2ZWZiYjIuMHAtNTksCS8qICAwLjAwODMzMzMyOTM4NTg4OTQ2MzE3NTYgKi8KK1MzID0gLTB4MWEwMGY5ZTJjYWU3NzQuMHAtNjUsCS8qIC0wLjAwMDE5ODM5MzM0ODM2MDk2NjMxNzM0NyAqLworUzQgPSAgMHgxNmNkODc4YzNiNDZhNy4wcC03MTsJLyogIDAuMDAwMDAyNzE4MzExNDkzOTg5ODIxOTA2NCAqLworCisjaWZkZWYgSU5MSU5FX0tFUk5FTF9TSU5ERgorZXh0ZXJuIGlubGluZQorI2VuZGlmCitmbG9hdAorX19rZXJuZWxfc2luZGYoZG91YmxlIHgpCit7CisJZG91YmxlIHIsIHMsIHcsIHo7CisKKwkvKiBUcnkgdG8gb3B0aW1pemUgZm9yIHBhcmFsbGVsIGV2YWx1YXRpb24gYXMgaW4ga190YW5mLmMuICovCisJeiA9IHgqeDsKKwl3ID0geip6OworCXIgPSBTMyt6KlM0OworCXMgPSB6Kng7CisJcmV0dXJuICh4ICsgcyooUzEreipTMikpICsgcyp3KnI7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9rX3Rhbi5jIGIvbGlibS9zcmMva190YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZlMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva190YW4uYwpAQCAtMCwwICsxLDEzMyBAQAorLyogQCgjKWtfdGFuLmMgMS41IDA0LzA0LzIyIFNNSSAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIElOREVOVCBPRkYgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9rX3Rhbi5jLHYgMS4xMiAyMDA1LzExLzAyIDE0OjAxOjQ1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogX19rZXJuZWxfdGFuKCB4LCB5LCBrICkKKyAqIGtlcm5lbCB0YW4gZnVuY3Rpb24gb24gflstcGkvNCwgcGkvNF0gKGV4Y2VwdCBvbiAtMCksIHBpLzQgfiAwLjc4NTQKKyAqIElucHV0IHggaXMgYXNzdW1lZCB0byBiZSBib3VuZGVkIGJ5IH5waS80IGluIG1hZ25pdHVkZS4KKyAqIElucHV0IHkgaXMgdGhlIHRhaWwgb2YgeC4KKyAqIElucHV0IGsgaW5kaWNhdGVzIHdoZXRoZXIgdGFuIChpZiBrID0gMSkgb3IgLTEvdGFuIChpZiBrID0gLTEpIGlzIHJldHVybmVkLgorICoKKyAqIEFsZ29yaXRobQorICoJMS4gU2luY2UgdGFuKC14KSA9IC10YW4oeCksIHdlIG5lZWQgb25seSB0byBjb25zaWRlciBwb3NpdGl2ZSB4LgorICoJMi4gQ2FsbGVycyBtdXN0IHJldHVybiB0YW4oLTApID0gLTAgd2l0aG91dCBjYWxsaW5nIGhlcmUgc2luY2Ugb3VyCisgKgkgICBvZGQgcG9seW5vbWlhbCBpcyBub3QgZXZhbHVhdGVkIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIC0wLgorICoJICAgQ2FsbGVycyBtYXkgZG8gdGhlIG9wdGltaXphdGlvbiB0YW4oeCkgfiB4IGZvciB0aW55IHguCisgKgkzLiB0YW4oeCkgaXMgYXBwcm94aW1hdGVkIGJ5IGEgb2RkIHBvbHlub21pYWwgb2YgZGVncmVlIDI3IG9uCisgKgkgICBbMCwwLjY3NDM0XQorICoJCSAgCSAgICAgICAgIDMgICAgICAgICAgICAgMjcKKyAqCSAgIAl0YW4oeCkgfiB4ICsgVDEqeCArIC4uLiArIFQxMyp4CisgKgkgICB3aGVyZQorICoKKyAqIAkgICAgICAgIHx0YW4oeCkgICAgICAgICAyICAgICA0ICAgICAgICAgICAgMjYgICB8ICAgICAtNTkuMgorICogCSAgICAgICAgfC0tLS0tIC0gKDErVDEqeCArVDIqeCArLi4uLiArVDEzKnggICAgKXwgPD0gMgorICogCSAgICAgICAgfCAgeCAJCQkJCXwKKyAqCisgKgkgICBOb3RlOiB0YW4oeCt5KSA9IHRhbih4KSArIHRhbicoeCkqeQorICoJCSAgICAgICAgICB+IHRhbih4KSArICgxK3gqeCkqeQorICoJICAgVGhlcmVmb3JlLCBmb3IgYmV0dGVyIGFjY3VyYWN5IGluIGNvbXB1dGluZyB0YW4oeCt5KSwgbGV0CisgKgkJICAgICAzICAgICAgMiAgICAgIDIgICAgICAgMiAgICAgICAyCisgKgkJciA9IHggKihUMit4ICooVDMreCAqKC4uLit4ICooVDEyK3ggKlQxMykpKSkKKyAqCSAgIHRoZW4KKyAqCQkgCQkgICAgMyAgICAyCisgKgkJdGFuKHgreSkgPSB4ICsgKFQxKnggKyAoeCAqKHIreSkreSkpCisgKgorICogICAgICA0LiBGb3IgeCBpbiBbMC42NzQzNCxwaS80XSwgIGxldCB5ID0gcGkvNCAtIHgsIHRoZW4KKyAqCQl0YW4oeCkgPSB0YW4ocGkvNC15KSA9ICgxLXRhbih5KSkvKDErdGFuKHkpKQorICoJCSAgICAgICA9IDEgLSAyKih0YW4oeSkgLSAodGFuKHkpXjIpLygxK3Rhbih5KSkpCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKK3N0YXRpYyBjb25zdCBkb3VibGUgeHh4W10gPSB7CisJCSAzLjMzMzMzMzMzMzMzMzM0MDkxOTg2ZS0wMSwJLyogM0ZENTU1NTUsIDU1NTU1NTYzICovCisJCSAxLjMzMzMzMzMzMzMzMjAxMjQyNjk5ZS0wMSwJLyogM0ZDMTExMTEsIDExMTBGRTdBICovCisJCSA1LjM5NjgyNTM5NzYyMjYwNTIxMzc3ZS0wMiwJLyogM0ZBQkExQkEsIDFCQjM0MUZFICovCisJCSAyLjE4Njk0ODgyOTQ4NTk1NDI0NTk5ZS0wMiwJLyogM0Y5NjY0RjQsIDg0MDZENjM3ICovCisJCSA4Ljg2MzIzOTgyMzU5OTMwMDA1NzM3ZS0wMywJLyogM0Y4MjI2RTMsIEU5NkU4NDkzICovCisJCSAzLjU5MjA3OTEwNzU5MTMxMjM1MzU2ZS0wMywJLyogM0Y2RDZEMjIsIEM5NTYwMzI4ICovCisJCSAxLjQ1NjIwOTQ1NDMyNTI5MDI1NTE2ZS0wMywJLyogM0Y1N0RCQzgsIEZFRTA4MzE1ICovCisJCSA1Ljg4MDQxMjQwODIwMjY0MDk2ODc0ZS0wNCwJLyogM0Y0MzQ0RDgsIEYyRjI2NTAxICovCisJCSAyLjQ2NDYzMTM0ODE4NDY5OTA2ODEyZS0wNCwJLyogM0YzMDI2RjcsIDFBOEQxMDY4ICovCisJCSA3LjgxNzk0NDQyOTM5NTU3MDkyMzAwZS0wNSwJLyogM0YxNDdFODgsIEEwMzc5MkE2ICovCisJCSA3LjE0MDcyNDkxMzgyNjA4MTkwMzA1ZS0wNSwJLyogM0YxMkI4MEYsIDMyRjBBN0U5ICovCisJCS0xLjg1NTg2Mzc0ODU1Mjc1NDU2NjU0ZS0wNSwJLyogQkVGMzc1Q0IsIERCNjA1MzczICovCisJCSAyLjU5MDczMDUxODYzNjMzNzEyODg0ZS0wNSwJLyogM0VGQjJBNzAsIDc0QkY3QUQ0ICovCisvKiBvbmUgKi8JIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLAkvKiAzRkYwMDAwMCwgMDAwMDAwMDAgKi8KKy8qIHBpbzQgKi8JIDcuODUzOTgxNjMzOTc0NDgyNzg5OTllLTAxLAkvKiAzRkU5MjFGQiwgNTQ0NDJEMTggKi8KKy8qIHBpbzRsbyAqLwkgMy4wNjE2MTY5OTc4NjgzODMwMTc5M2UtMTcJLyogM0M4MUE2MjYsIDMzMTQ1QzA3ICovCit9OworI2RlZmluZQlvbmUJeHh4WzEzXQorI2RlZmluZQlwaW80CXh4eFsxNF0KKyNkZWZpbmUJcGlvNGxvCXh4eFsxNV0KKyNkZWZpbmUJVAl4eHgKKy8qIElOREVOVCBPTiAqLworCitkb3VibGUKK19fa2VybmVsX3Rhbihkb3VibGUgeCwgZG91YmxlIHksIGludCBpeSkgeworCWRvdWJsZSB6LCByLCB2LCB3LCBzOworCWludDMyX3QgaXgsIGh4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsJCQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisJaWYgKGl4ID49IDB4M0ZFNTk0MjgpIHsJLyogfHh8ID49IDAuNjc0NCAqLworCQlpZiAoaHggPCAwKSB7CisJCQl4ID0gLXg7CisJCQl5ID0gLXk7CisJCX0KKwkJeiA9IHBpbzQgLSB4OworCQl3ID0gcGlvNGxvIC0geTsKKwkJeCA9IHogKyB3OworCQl5ID0gMC4wOworCX0KKwl6ID0geCAqIHg7CisJdyA9IHogKiB6OworCS8qCisJICogQnJlYWsgeF41KihUWzFdK3heMipUWzJdKy4uLikgaW50bworCSAqIHheNShUWzFdK3heNCpUWzNdKy4uLit4XjIwKlRbMTFdKSArCisJICogeF41KHheMiooVFsyXSt4XjQqVFs0XSsuLi4reF4yMipbVDEyXSkpCisJICovCisJciA9IFRbMV0gKyB3ICogKFRbM10gKyB3ICogKFRbNV0gKyB3ICogKFRbN10gKyB3ICogKFRbOV0gKworCQl3ICogVFsxMV0pKSkpOworCXYgPSB6ICogKFRbMl0gKyB3ICogKFRbNF0gKyB3ICogKFRbNl0gKyB3ICogKFRbOF0gKyB3ICogKFRbMTBdICsKKwkJdyAqIFRbMTJdKSkpKSk7CisJcyA9IHogKiB4OworCXIgPSB5ICsgeiAqIChzICogKHIgKyB2KSArIHkpOworCXIgKz0gVFswXSAqIHM7CisJdyA9IHggKyByOworCWlmIChpeCA+PSAweDNGRTU5NDI4KSB7CisJCXYgPSAoZG91YmxlKSBpeTsKKwkJcmV0dXJuIChkb3VibGUpICgxIC0gKChoeCA+PiAzMCkgJiAyKSkgKgorCQkJKHYgLSAyLjAgKiAoeCAtICh3ICogdyAvICh3ICsgdikgLSByKSkpOworCX0KKwlpZiAoaXkgPT0gMSkKKwkJcmV0dXJuIHc7CisJZWxzZSB7CisJCS8qCisJCSAqIGlmIGFsbG93IGVycm9yIHVwIHRvIDIgdWxwLCBzaW1wbHkgcmV0dXJuCisJCSAqIC0xLjAgLyAoeCtyKSBoZXJlCisJCSAqLworCQkvKiBjb21wdXRlIC0xLjAgLyAoeCtyKSBhY2N1cmF0ZWx5ICovCisJCWRvdWJsZSBhLCB0OworCQl6ID0gdzsKKwkJU0VUX0xPV19XT1JEKHosMCk7CisJCXYgPSByIC0gKHogLSB4KTsJLyogeit2ID0gcit4ICovCisJCXQgPSBhID0gLTEuMCAvIHc7CS8qIGEgPSAtMS4wL3cgKi8KKwkJU0VUX0xPV19XT1JEKHQsMCk7CisJCXMgPSAxLjAgKyB0ICogejsKKwkJcmV0dXJuIHQgKyBhICogKHMgKyB0ICogdik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMva190YW5mLmMgYi9saWJtL3NyYy9rX3RhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc0MDMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMva190YW5mLmMKQEAgLTAsMCArMSw2NyBAQAorLyoga190YW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBrX3Rhbi5jCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgSU5MSU5FX0tFUk5FTF9UQU5ERgorI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL2tfdGFuZi5jLHYgMS4yMCAyMDA1LzExLzI4IDExOjQ2OjIwIGJkZSBFeHAgJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisvKiB8dGFuKHgpL3ggLSB0KHgpfCA8IDIqKi0yNS41ICh+Wy0yZS0wOCwgMmUtMDhdKS4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK1RbXSA9ICB7CisgIDB4MTU1NTRkMzQxOGM5OWYuMHAtNTQsCS8qIDAuMzMzMzMxMzk1MDMwNzkxMzk5NzU4ICovCisgIDB4MTExMmZkMzg5OTlmNzIuMHAtNTUsCS8qIDAuMTMzMzkyMDAyNzEyOTc2NzQyNzE4ICovCisgIDB4MWI1NGM5MWQ4NjVhZmUuMHAtNTcsCS8qIDAuMDUzMzgxMjM3ODQ0NTY3MDM5MzUyMyAqLworICAweDE5MWRmMzkwOGMzM2NlLjBwLTU4LAkvKiAwLjAyNDUyODMxODExNjY1NDcyNzg4NzMgKi8KKyAgMHgxODVkYWRmY2VjZjQ0ZS4wcC02MSwJLyogMC4wMDI5NzQzNTc0MzM1OTk2NzMwNDkyNyAqLworICAweDEzNjJiOWJmOTcxYmNkLjBwLTU5LAkvKiAwLjAwOTQ2NTY0Nzg0OTQzNjczMTY2NzI4ICovCit9OworCisjaWZkZWYgSU5MSU5FX0tFUk5FTF9UQU5ERgorZXh0ZXJuIGlubGluZQorI2VuZGlmCitmbG9hdAorX19rZXJuZWxfdGFuZGYoZG91YmxlIHgsIGludCBpeSkKK3sKKwlkb3VibGUgeixyLHcscyx0LHU7CisKKwl6CT0gIHgqeDsKKwkvKgorCSAqIFNwbGl0IHVwIHRoZSBwb2x5bm9taWFsIGludG8gc21hbGwgaW5kZXBlbmRlbnQgdGVybXMgdG8gZ2l2ZQorCSAqIG9wcG9ydHVuaXRpZXMgZm9yIHBhcmFsbGVsIGV2YWx1YXRpb24uICBUaGUgY2hvc2VuIHNwbGl0dGluZyBpcworCSAqIG1pY3JvLW9wdGltaXplZCBmb3IgQXRobG9ucyAoWFAsIFg2NCkuICBJdCBjb3N0cyAyIG11bHRpcGxpY2F0aW9ucworCSAqIHJlbGF0aXZlIHRvIEhvcm5lcidzIG1ldGhvZCBvbiBzZXF1ZW50aWFsIG1hY2hpbmVzLgorCSAqCisJICogV2UgYWRkIHRoZSBzbWFsbCB0ZXJtcyBmcm9tIGxvd2VzdCBkZWdyZWUgdXAgZm9yIGVmZmljaWVuY3kgb24KKwkgKiBub24tc2VxdWVudGlhbCBtYWNoaW5lcyAodGhlIGxvd2VzdCBkZWdyZWUgdGVybXMgdGVuZCB0byBiZSByZWFkeQorCSAqIGVhcmxpZXIpLiAgQXBhcnQgZnJvbSB0aGlzLCB3ZSBkb24ndCBjYXJlIGFib3V0IG9yZGVyIG9mCisJICogb3BlcmF0aW9ucywgYW5kIGRvbid0IG5lZWQgdG8gdG8gY2FyZSBzaW5jZSB3ZSBoYXZlIHByZWNpc2lvbiB0bworCSAqIHNwYXJlLiAgSG93ZXZlciwgdGhlIGNob3NlbiBzcGxpdHRpbmcgaXMgZ29vZCBmb3IgYWNjdXJhY3kgdG9vLAorCSAqIGFuZCB3b3VsZCBnaXZlIHJlc3VsdHMgYXMgYWNjdXJhdGUgYXMgSG9ybmVyJ3MgbWV0aG9kIGlmIHRoZQorCSAqIHNtYWxsIHRlcm1zIHdlcmUgYWRkZWQgZnJvbSBoaWdoZXN0IGRlZ3JlZSBkb3duLgorCSAqLworCXIgPSBUWzRdK3oqVFs1XTsKKwl0ID0gVFsyXSt6KlRbM107CisJdyA9IHoqejsKKwlzID0geip4OworCXUgPSBUWzBdK3oqVFsxXTsKKwlyID0gKHgrcyp1KSsocyp3KSoodCt3KnIpOworCWlmKGl5PT0xKSByZXR1cm4gcjsKKwllbHNlIHJldHVybiAtMS4wL3I7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9tYXRoX3ByaXZhdGUuaCBiL2xpYm0vc3JjL21hdGhfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmUwODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9tYXRoX3ByaXZhdGUuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogZnJvbTogQCgjKWZkbGlibS5oIDUuMSA5My8wOS8yNAorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvbWF0aF9wcml2YXRlLmgsdiAxLjIwIDIwMDUvMTEvMjggMDQ6NTg6NTcgYmRlIEV4cCAkCisgKi8KKworI2lmbmRlZiBfTUFUSF9QUklWQVRFX0hfCisjZGVmaW5lCV9NQVRIX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisvKgorICogVGhlIG9yaWdpbmFsIGZkbGlibSBjb2RlIHVzZWQgc3RhdGVtZW50cyBsaWtlOgorICoJbjAgPSAoKCooaW50Kikmb25lKT4+MjkpXjE7CQkqIGluZGV4IG9mIGhpZ2ggd29yZCAqCisgKglpeDAgPSAqKG4wKyhpbnQqKSZ4KTsJCQkqIGhpZ2ggd29yZCBvZiB4ICoKKyAqCWl4MSA9ICooKDEtbjApKyhpbnQqKSZ4KTsJCSogbG93IHdvcmQgb2YgeCAqCisgKiB0byBkaWcgdHdvIDMyIGJpdCB3b3JkcyBvdXQgb2YgdGhlIDY0IGJpdCBJRUVFIGZsb2F0aW5nIHBvaW50CisgKiB2YWx1ZS4gIFRoYXQgaXMgbm9uLUFOU0ksIGFuZCwgbW9yZW92ZXIsIHRoZSBnY2MgaW5zdHJ1Y3Rpb24KKyAqIHNjaGVkdWxlciBnZXRzIGl0IHdyb25nLiAgV2UgaW5zdGVhZCB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3MuCisgKiBVbmxpa2UgdGhlIG9yaWdpbmFsIGNvZGUsIHdlIGRldGVybWluZSB0aGUgZW5kaWFubmVzcyBhdCBjb21waWxlCisgKiB0aW1lLCBub3QgYXQgcnVuIHRpbWU7IEkgZG9uJ3Qgc2VlIG11Y2ggYmVuZWZpdCB0byBzZWxlY3RpbmcKKyAqIGVuZGlhbm5lc3MgYXQgcnVuIHRpbWUuCisgKi8KKworLyoKKyAqIEEgdW5pb24gd2hpY2ggcGVybWl0cyB1cyB0byBjb252ZXJ0IGJldHdlZW4gYSBkb3VibGUgYW5kIHR3byAzMiBiaXQKKyAqIGludHMuCisgKi8KKworI2lmIChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOKSB8fCAoZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1ZGUF9GUF9fKSkKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgdmFsdWU7CisgIHN0cnVjdAorICB7CisgICAgdV9pbnQzMl90IG1zdzsKKyAgICB1X2ludDMyX3QgbHN3OworICB9IHBhcnRzOworfSBpZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gICYmICEoZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX1ZGUF9GUF9fKSkKKwordHlwZWRlZiB1bmlvbgoreworICBkb3VibGUgdmFsdWU7CisgIHN0cnVjdAorICB7CisgICAgdV9pbnQzMl90IGxzdzsKKyAgICB1X2ludDMyX3QgbXN3OworICB9IHBhcnRzOworfSBpZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworLyogR2V0IHR3byAzMiBiaXQgaW50cyBmcm9tIGEgZG91YmxlLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1dPUkRTKGl4MCxpeDEsZCkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIGV3X3U7CQkJCQlcCisgIGV3X3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaXgwKSA9IGV3X3UucGFydHMubXN3OwkJCQkJXAorICAoaXgxKSA9IGV3X3UucGFydHMubHN3OwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogR2V0IHRoZSBtb3JlIHNpZ25pZmljYW50IDMyIGJpdCBpbnQgZnJvbSBhIGRvdWJsZS4gICovCisKKyNkZWZpbmUgR0VUX0hJR0hfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2hfdTsJCQkJCVwKKyAgZ2hfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdoX3UucGFydHMubXN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIEdldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXQgaW50IGZyb20gYSBkb3VibGUuICAqLworCisjZGVmaW5lIEdFVF9MT1dfV09SRChpLGQpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGllZWVfZG91YmxlX3NoYXBlX3R5cGUgZ2xfdTsJCQkJCVwKKyAgZ2xfdS52YWx1ZSA9IChkKTsJCQkJCQlcCisgIChpKSA9IGdsX3UucGFydHMubHN3OwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCBhIGRvdWJsZSBmcm9tIHR3byAzMiBiaXQgaW50cy4gICovCisKKyNkZWZpbmUgSU5TRVJUX1dPUkRTKGQsaXgwLGl4MSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBpd191OwkJCQkJXAorICBpd191LnBhcnRzLm1zdyA9IChpeDApOwkJCQkJXAorICBpd191LnBhcnRzLmxzdyA9IChpeDEpOwkJCQkJXAorICAoZCkgPSBpd191LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbW9yZSBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfSElHSF9XT1JEKGQsdikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9kb3VibGVfc2hhcGVfdHlwZSBzaF91OwkJCQkJXAorICBzaF91LnZhbHVlID0gKGQpOwkJCQkJCVwKKyAgc2hfdS5wYXJ0cy5tc3cgPSAodik7CQkJCQkJXAorICAoZCkgPSBzaF91LnZhbHVlOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFNldCB0aGUgbGVzcyBzaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgZG91YmxlIGZyb20gYW4gaW50LiAgKi8KKworI2RlZmluZSBTRVRfTE9XX1dPUkQoZCx2KQkJCQkJXAorZG8gewkJCQkJCQkJXAorICBpZWVlX2RvdWJsZV9zaGFwZV90eXBlIHNsX3U7CQkJCQlcCisgIHNsX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICBzbF91LnBhcnRzLmxzdyA9ICh2KTsJCQkJCQlcCisgIChkKSA9IHNsX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEEgdW5pb24gd2hpY2ggcGVybWl0cyB1cyB0byBjb252ZXJ0IGJldHdlZW4gYSBmbG9hdCBhbmQgYSAzMiBiaXQKKyAqIGludC4KKyAqLworCit0eXBlZGVmIHVuaW9uCit7CisgIGZsb2F0IHZhbHVlOworICAvKiBGSVhNRTogQXNzdW1lcyAzMiBiaXQgaW50LiAgKi8KKyAgdW5zaWduZWQgaW50IHdvcmQ7Cit9IGllZWVfZmxvYXRfc2hhcGVfdHlwZTsKKworLyogR2V0IGEgMzIgYml0IGludCBmcm9tIGEgZmxvYXQuICAqLworCisjZGVmaW5lIEdFVF9GTE9BVF9XT1JEKGksZCkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIGdmX3U7CQkJCQlcCisgIGdmX3UudmFsdWUgPSAoZCk7CQkJCQkJXAorICAoaSkgPSBnZl91LndvcmQ7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogU2V0IGEgZmxvYXQgZnJvbSBhIDMyIGJpdCBpbnQuICAqLworCisjZGVmaW5lIFNFVF9GTE9BVF9XT1JEKGQsaSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWVlZV9mbG9hdF9zaGFwZV90eXBlIHNmX3U7CQkJCQlcCisgIHNmX3Uud29yZCA9IChpKTsJCQkJCQlcCisgIChkKSA9IHNmX3UudmFsdWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIF9DT01QTEVYX0gKKy8qCisgKiBJbmxpbmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGNvbXBsZXggdmFsdWVzLgorICoKKyAqIFRoZSBDOTkgc3RhbmRhcmQgaW50ZW5kcyB4K0kqeSB0byBiZSB1c2VkIGZvciB0aGlzLCBidXQgeCtJKnkgaXMKKyAqIGN1cnJlbnRseSB1bnVzYWJsZSBpbiBnZW5lcmFsIHNpbmNlIGdjYyBpbnRyb2R1Y2VzIG1hbnkgb3ZlcmZsb3csCisgKiB1bmRlcmZsb3csIHNpZ24gYW5kIGVmZmljaWVuY3kgYnVncyBieSByZXdyaXRpbmcgSSp5IGFzCisgKiAoMC4wK0kpKih5KzAuMCpJKSBhbmQgbGFib3Jpb3VzbHkgY29tcHV0aW5nIHRoZSBmdWxsIGNvbXBsZXggcHJvZHVjdC4KKyAqIEluIHBhcnRpY3VsYXIsIEkqSW5mIGlzIGNvcnJ1cHRlZCB0byBOYU4rSSpJbmYsIGFuZCBJKi0wIGlzIGNvcnJ1cHRlZAorICogdG8gLTAuMCtJKjAuMC4KKyAqLworc3RhdGljIF9faW5saW5lIGZsb2F0IGNvbXBsZXgKK2NwYWNrZihmbG9hdCB4LCBmbG9hdCB5KQoreworCWZsb2F0IGNvbXBsZXggejsKKworCV9fcmVhbF9fIHogPSB4OworCV9faW1hZ19fIHogPSB5OworCXJldHVybiAoeik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBkb3VibGUgY29tcGxleAorY3BhY2soZG91YmxlIHgsIGRvdWJsZSB5KQoreworCWRvdWJsZSBjb21wbGV4IHo7CisKKwlfX3JlYWxfXyB6ID0geDsKKwlfX2ltYWdfXyB6ID0geTsKKwlyZXR1cm4gKHopOworfQorCitzdGF0aWMgX19pbmxpbmUgbG9uZyBkb3VibGUgY29tcGxleAorY3BhY2tsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJbG9uZyBkb3VibGUgY29tcGxleCB6OworCisJX19yZWFsX18geiA9IHg7CisJX19pbWFnX18geiA9IHk7CisJcmV0dXJuICh6KTsKK30KKyNlbmRpZiAvKiBfQ09NUExFWF9IICovCisgCisvKgorICogaWVlZSBzdHlsZSBlbGVtZW50YXJ5IGZ1bmN0aW9ucworICoKKyAqIFdlIHJlbmFtZSBmdW5jdGlvbnMgaGVyZSB0byBpbXByb3ZlIG90aGVyIHNvdXJjZXMnIGRpZmZhYmlsaXR5CisgKiBhZ2FpbnN0IGZkbGlibS4KKyAqLworI2RlZmluZQlfX2llZWU3NTRfc3FydAlzcXJ0CisjZGVmaW5lCV9faWVlZTc1NF9hY29zCWFjb3MKKyNkZWZpbmUJX19pZWVlNzU0X2Fjb3NoCWFjb3NoCisjZGVmaW5lCV9faWVlZTc1NF9sb2cJbG9nCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuaAlhdGFuaAorI2RlZmluZQlfX2llZWU3NTRfYXNpbglhc2luCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuMglhdGFuMgorI2RlZmluZQlfX2llZWU3NTRfZXhwCWV4cAorI2RlZmluZQlfX2llZWU3NTRfY29zaAljb3NoCisjZGVmaW5lCV9faWVlZTc1NF9mbW9kCWZtb2QKKyNkZWZpbmUJX19pZWVlNzU0X3Bvdwlwb3cKKyNkZWZpbmUJX19pZWVlNzU0X2xnYW1tYSBsZ2FtbWEKKyNkZWZpbmUJX19pZWVlNzU0X2dhbW1hCWdhbW1hCisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWFfciBsZ2FtbWFfcgorI2RlZmluZQlfX2llZWU3NTRfZ2FtbWFfciBnYW1tYV9yCisjZGVmaW5lCV9faWVlZTc1NF9sb2cxMAlsb2cxMAorI2RlZmluZQlfX2llZWU3NTRfc2luaAlzaW5oCisjZGVmaW5lCV9faWVlZTc1NF9oeXBvdAloeXBvdAorI2RlZmluZQlfX2llZWU3NTRfajAJajAKKyNkZWZpbmUJX19pZWVlNzU0X2oxCWoxCisjZGVmaW5lCV9faWVlZTc1NF95MAl5MAorI2RlZmluZQlfX2llZWU3NTRfeTEJeTEKKyNkZWZpbmUJX19pZWVlNzU0X2puCWpuCisjZGVmaW5lCV9faWVlZTc1NF95bgl5bgorI2RlZmluZQlfX2llZWU3NTRfcmVtYWluZGVyIHJlbWFpbmRlcgorI2RlZmluZQlfX2llZWU3NTRfc2NhbGIJc2NhbGIKKyNkZWZpbmUJX19pZWVlNzU0X3NxcnRmCXNxcnRmCisjZGVmaW5lCV9faWVlZTc1NF9hY29zZglhY29zZgorI2RlZmluZQlfX2llZWU3NTRfYWNvc2hmIGFjb3NoZgorI2RlZmluZQlfX2llZWU3NTRfbG9nZglsb2dmCisjZGVmaW5lCV9faWVlZTc1NF9hdGFuaGYgYXRhbmhmCisjZGVmaW5lCV9faWVlZTc1NF9hc2luZglhc2luZgorI2RlZmluZQlfX2llZWU3NTRfYXRhbjJmIGF0YW4yZgorI2RlZmluZQlfX2llZWU3NTRfZXhwZglleHBmCisjZGVmaW5lCV9faWVlZTc1NF9jb3NoZgljb3NoZgorI2RlZmluZQlfX2llZWU3NTRfZm1vZGYJZm1vZGYKKyNkZWZpbmUJX19pZWVlNzU0X3Bvd2YJcG93ZgorI2RlZmluZQlfX2llZWU3NTRfbGdhbW1hZiBsZ2FtbWFmCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYWYgZ2FtbWFmCisjZGVmaW5lCV9faWVlZTc1NF9sZ2FtbWFmX3IgbGdhbW1hZl9yCisjZGVmaW5lCV9faWVlZTc1NF9nYW1tYWZfciBnYW1tYWZfcgorI2RlZmluZQlfX2llZWU3NTRfbG9nMTBmIGxvZzEwZgorI2RlZmluZQlfX2llZWU3NTRfc2luaGYJc2luaGYKKyNkZWZpbmUJX19pZWVlNzU0X2h5cG90ZiBoeXBvdGYKKyNkZWZpbmUJX19pZWVlNzU0X2owZglqMGYKKyNkZWZpbmUJX19pZWVlNzU0X2oxZglqMWYKKyNkZWZpbmUJX19pZWVlNzU0X3kwZgl5MGYKKyNkZWZpbmUJX19pZWVlNzU0X3kxZgl5MWYKKyNkZWZpbmUJX19pZWVlNzU0X2puZglqbmYKKyNkZWZpbmUJX19pZWVlNzU0X3luZgl5bmYKKyNkZWZpbmUJX19pZWVlNzU0X3JlbWFpbmRlcmYgcmVtYWluZGVyZgorI2RlZmluZQlfX2llZWU3NTRfc2NhbGJmIHNjYWxiZgorI2RlZmluZSBfX2llZWU3NTRfbGRleHBmIGxkZXhwZgorCisvKiBmZGxpYm0ga2VybmVsIGZ1bmN0aW9uICovCitpbnQJX19pZWVlNzU0X3JlbV9waW8yKGRvdWJsZSxkb3VibGUqKTsKK2RvdWJsZQlfX2tlcm5lbF9zaW4oZG91YmxlLGRvdWJsZSxpbnQpOworZG91YmxlCV9fa2VybmVsX2Nvcyhkb3VibGUsZG91YmxlKTsKK2RvdWJsZQlfX2tlcm5lbF90YW4oZG91YmxlLGRvdWJsZSxpbnQpOworaW50CV9fa2VybmVsX3JlbV9waW8yKGRvdWJsZSosZG91YmxlKixpbnQsaW50LGludCxjb25zdCBpbnQqKTsKKworLyogZmxvYXQgdmVyc2lvbnMgb2YgZmRsaWJtIGtlcm5lbCBmdW5jdGlvbnMgKi8KK2ludAlfX2llZWU3NTRfcmVtX3BpbzJmKGZsb2F0LGZsb2F0Kik7CitmbG9hdAlfX2tlcm5lbF9zaW5kZihkb3VibGUpOworZmxvYXQJX19rZXJuZWxfY29zZGYoZG91YmxlKTsKK2Zsb2F0CV9fa2VybmVsX3RhbmRmKGRvdWJsZSxpbnQpOworaW50CV9fa2VybmVsX3JlbV9waW8yZihmbG9hdCosZmxvYXQqLGludCxpbnQsaW50LGNvbnN0IGludCopOworCisjZW5kaWYgLyogIV9NQVRIX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXNpbmguYyBiL2xpYm0vc3JjL3NfYXNpbmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkwMDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19hc2luaC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEAoIylzX2FzaW5oLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2FzaW5oLmMsdiAxLjggMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qIGFzaW5oKHgpCisgKiBNZXRob2QgOgorICoJQmFzZWQgb24KKyAqCQlhc2luaCh4KSA9IHNpZ24oeCkgKiBsb2cgWyB8eHwgKyBzcXJ0KHgqeCsxKSBdCisgKgl3ZSBoYXZlCisgKglhc2luaCh4KSA6PSB4ICBpZiAgMSt4Kng9MSwKKyAqCQkgOj0gc2lnbih4KSoobG9nKHgpK2xuMikpIGZvciBsYXJnZSB8eHwsIGVsc2UKKyAqCQkgOj0gc2lnbih4KSpsb2coMnx4fCsxLyh8eHwrc3FydCh4KngrMSkpKSBpZnx4fD4yLCBlbHNlCisgKgkJIDo9IHNpZ24oeCkqbG9nMXAofHh8ICsgeF4yLygxICsgc3FydCgxK3heMikpKQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK29uZSA9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHgzRkYwMDAwMCwgMHgwMDAwMDAwMCAqLworbG4yID0gIDYuOTMxNDcxODA1NTk5NDUyODYyMjdlLTAxLCAvKiAweDNGRTYyRTQyLCAweEZFRkEzOUVGICovCitodWdlPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMzAwOworCitkb3VibGUKK2FzaW5oKGRvdWJsZSB4KQoreworCWRvdWJsZSB0LHc7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsJLyogeCBpcyBpbmYgb3IgTmFOICovCisJaWYoaXg8IDB4M2UzMDAwMDApIHsJLyogfHh8PDIqKi0yOCAqLworCSAgICBpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmV0dXJuIHggaW5leGFjdCBleGNlcHQgMCAqLworCX0KKwlpZihpeD4weDQxYjAwMDAwKSB7CS8qIHx4fCA+IDIqKjI4ICovCisJICAgIHcgPSBfX2llZWU3NTRfbG9nKGZhYnMoeCkpK2xuMjsKKwl9IGVsc2UgaWYgKGl4PjB4NDAwMDAwMDApIHsJLyogMioqMjggPiB8eHwgPiAyLjAgKi8KKwkgICAgdCA9IGZhYnMoeCk7CisJICAgIHcgPSBfX2llZWU3NTRfbG9nKDIuMCp0K29uZS8oX19pZWVlNzU0X3NxcnQoeCp4K29uZSkrdCkpOworCX0gZWxzZSB7CQkvKiAyLjAgPiB8eHwgPiAyKiotMjggKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgdyA9bG9nMXAoZmFicyh4KSt0LyhvbmUrX19pZWVlNzU0X3NxcnQob25lK3QpKSk7CisJfQorCWlmKGh4PjApIHJldHVybiB3OyBlbHNlIHJldHVybiAtdzsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfYXNpbmhmLmMgYi9saWJtL3NyYy9zX2FzaW5oZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2FzaW5oZi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHNfYXNpbmhmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2FzaW5oLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2FzaW5oZi5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK29uZSA9ICAxLjAwMDAwMDAwMDBlKzAwLCAvKiAweDNGODAwMDAwICovCitsbjIgPSAgNi45MzE0NzE4MjQ2ZS0wMSwgLyogMHgzZjMxNzIxOCAqLworaHVnZT0gIDEuMDAwMDAwMDAwMGUrMzA7CisKK2Zsb2F0Cithc2luaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHc7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CS8qIHggaXMgaW5mIG9yIE5hTiAqLworCWlmKGl4PCAweDMxODAwMDAwKSB7CS8qIHx4fDwyKiotMjggKi8KKwkgICAgaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJldHVybiB4IGluZXhhY3QgZXhjZXB0IDAgKi8KKwl9CisJaWYoaXg+MHg0ZDgwMDAwMCkgewkvKiB8eHwgPiAyKioyOCAqLworCSAgICB3ID0gX19pZWVlNzU0X2xvZ2YoZmFic2YoeCkpK2xuMjsKKwl9IGVsc2UgaWYgKGl4PjB4NDAwMDAwMDApIHsJLyogMioqMjggPiB8eHwgPiAyLjAgKi8KKwkgICAgdCA9IGZhYnNmKHgpOworCSAgICB3ID0gX19pZWVlNzU0X2xvZ2YoKGZsb2F0KTIuMCp0K29uZS8oX19pZWVlNzU0X3NxcnRmKHgqeCtvbmUpK3QpKTsKKwl9IGVsc2UgewkJLyogMi4wID4gfHh8ID4gMioqLTI4ICovCisJICAgIHQgPSB4Kng7CisJICAgIHcgPWxvZzFwZihmYWJzZih4KSt0LyhvbmUrX19pZWVlNzU0X3NxcnRmKG9uZSt0KSkpOworCX0KKwlpZihoeD4wKSByZXR1cm4gdzsgZWxzZSByZXR1cm4gLXc7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2F0YW4uYyBiL2xpYm0vc3JjL3NfYXRhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDdhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2F0YW4uYwpAQCAtMCwwICsxLDExOSBAQAorLyogQCgjKXNfYXRhbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19hdGFuLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyogYXRhbih4KQorICogTWV0aG9kCisgKiAgIDEuIFJlZHVjZSB4IHRvIHBvc2l0aXZlIGJ5IGF0YW4oeCkgPSAtYXRhbigteCkuCisgKiAgIDIuIEFjY29yZGluZyB0byB0aGUgaW50ZWdlciBrPTR0KzAuMjUgY2hvcHBlZCwgdD14LCB0aGUgYXJndW1lbnQKKyAqICAgICAgaXMgZnVydGhlciByZWR1Y2VkIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVydmFscyBhbmQgdGhlCisgKiAgICAgIGFyY3RhbmdlbnQgb2YgdCBpcyBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybXVsYToKKyAqCisgKiAgICAgIFswLDcvMTZdICAgICAgYXRhbih4KSA9IHQtdF4zKihhMSt0XjIqKGEyKy4uLihhMTArdF4yKmExMSkuLi4pCisgKiAgICAgIFs3LzE2LDExLzE2XSAgYXRhbih4KSA9IGF0YW4oMS8yKSArIGF0YW4oICh0LTAuNSkvKDErdC8yKSApCisgKiAgICAgIFsxMS8xNi4xOS8xNl0gYXRhbih4KSA9IGF0YW4oIDEgKSArIGF0YW4oICh0LTEpLygxK3QpICkKKyAqICAgICAgWzE5LzE2LDM5LzE2XSBhdGFuKHgpID0gYXRhbigzLzIpICsgYXRhbiggKHQtMS41KS8oMSsxLjV0KSApCisgKiAgICAgIFszOS8xNixJTkZdICAgYXRhbih4KSA9IGF0YW4oSU5GKSArIGF0YW4oIC0xL3QgKQorICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBhdGFuaGlbXSA9IHsKKyAgNC42MzY0NzYwOTAwMDgwNjA5MzUxNWUtMDEsIC8qIGF0YW4oMC41KWhpIDB4M0ZEREFDNjcsIDB4MDU2MUJCNEYgKi8KKyAgNy44NTM5ODE2MzM5NzQ0ODI3ODk5OWUtMDEsIC8qIGF0YW4oMS4wKWhpIDB4M0ZFOTIxRkIsIDB4NTQ0NDJEMTggKi8KKyAgOS44Mjc5MzcyMzI0NzMyOTA1NDA4MmUtMDEsIC8qIGF0YW4oMS41KWhpIDB4M0ZFRjczMEIsIDB4RDI4MUY2OUIgKi8KKyAgMS41NzA3OTYzMjY3OTQ4OTY1NTgwMGUrMDAsIC8qIGF0YW4oaW5mKWhpIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgYXRhbmxvW10gPSB7CisgIDIuMjY5ODc3NzQ1Mjk2MTY4NzA5MjRlLTE3LCAvKiBhdGFuKDAuNSlsbyAweDNDN0EyQjdGLCAweDIyMkY2NUUyICovCisgIDMuMDYxNjE2OTk3ODY4MzgzMDE3OTNlLTE3LCAvKiBhdGFuKDEuMClsbyAweDNDODFBNjI2LCAweDMzMTQ1QzA3ICovCisgIDEuMzkwMzMxMTAzMTIzMDk5ODQ1MTZlLTE3LCAvKiBhdGFuKDEuNSlsbyAweDNDNzAwNzg4LCAweDdBRjBDQkJEICovCisgIDYuMTIzMjMzOTk1NzM2NzY2MDM1ODdlLTE3LCAvKiBhdGFuKGluZilsbyAweDNDOTFBNjI2LCAweDMzMTQ1QzA3ICovCit9OworCitzdGF0aWMgY29uc3QgZG91YmxlIGFUW10gPSB7CisgIDMuMzMzMzMzMzMzMzMzMjkzMTgwMjdlLTAxLCAvKiAweDNGRDU1NTU1LCAweDU1NTU1NTBEICovCisgLTEuOTk5OTk5OTk5OTg3NjQ4MzI0NzZlLTAxLCAvKiAweEJGQzk5OTk5LCAweDk5OThFQkM0ICovCisgIDEuNDI4NTcxNDI3MjUwMzQ2NjM3MTFlLTAxLCAvKiAweDNGQzI0OTI0LCAweDkyMDA4M0ZGICovCisgLTEuMTExMTExMDQwNTQ2MjM1NTc4ODBlLTAxLCAvKiAweEJGQkM3MUM2LCAweEZFMjMxNjcxICovCisgIDkuMDkwODg3MTMzNDM2NTA2NTYxOTZlLTAyLCAvKiAweDNGQjc0NUNELCAweEM1NEMyMDZFICovCisgLTcuNjkxODc2MjA1MDQ0ODI5OTk0OTVlLTAyLCAvKiAweEJGQjNCMEYyLCAweEFGNzQ5QTZEICovCisgIDYuNjYxMDczMTM3Mzg3NTMxMjA2NjllLTAyLCAvKiAweDNGQjEwRDY2LCAweEEwRDAzRDUxICovCisgLTUuODMzNTcwMTMzNzkwNTczNDg2NDVlLTAyLCAvKiAweEJGQURERTJELCAweDUyREVGRDlBICovCisgIDQuOTc2ODc3OTk0NjE1OTMyMzYwMTdlLTAyLCAvKiAweDNGQTk3QjRCLCAweDI0NzYwREVCICovCisgLTMuNjUzMTU3Mjc0NDIxNjkxNTUyNzBlLTAyLCAvKiAweEJGQTJCNDQ0LCAweDJDNkE2QzJGICovCisgIDEuNjI4NTgyMDExNTM2NTc4MjM2MjNlLTAyLCAvKiAweDNGOTBBRDNBLCAweEUzMjJEQTExICovCit9OworCisJc3RhdGljIGNvbnN0IGRvdWJsZQorb25lICAgPSAxLjAsCitodWdlICAgPSAxLjBlMzAwOworCitkb3VibGUKK2F0YW4oZG91YmxlIHgpCit7CisJZG91YmxlIHcsczEsczIsejsKKwlpbnQzMl90IGl4LGh4LGlkOworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NDQxMDAwMDApIHsJLyogaWYgfHh8ID49IDJeNjYgKi8KKwkgICAgdV9pbnQzMl90IGxvdzsKKwkgICAgR0VUX0xPV19XT1JEKGxvdyx4KTsKKwkgICAgaWYoaXg+MHg3ZmYwMDAwMHx8CisJCShpeD09MHg3ZmYwMDAwMCYmKGxvdyE9MCkpKQorCQlyZXR1cm4geCt4OwkJLyogTmFOICovCisJICAgIGlmKGh4PjApIHJldHVybiAgYXRhbmhpWzNdK2F0YW5sb1szXTsKKwkgICAgZWxzZSAgICAgcmV0dXJuIC1hdGFuaGlbM10tYXRhbmxvWzNdOworCX0gaWYgKGl4IDwgMHgzZmRjMDAwMCkgewkvKiB8eHwgPCAwLjQzNzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzZTIwMDAwMCkgewkvKiB8eHwgPCAyXi0yOSAqLworCQlpZihodWdlK3g+b25lKSByZXR1cm4geDsJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICB9CisJICAgIGlkID0gLTE7CisJfSBlbHNlIHsKKwl4ID0gZmFicyh4KTsKKwlpZiAoaXggPCAweDNmZjMwMDAwKSB7CQkvKiB8eHwgPCAxLjE4NzUgKi8KKwkgICAgaWYgKGl4IDwgMHgzZmU2MDAwMCkgewkvKiA3LzE2IDw9fHh8PDExLzE2ICovCisJCWlkID0gMDsgeCA9ICgyLjAqeC1vbmUpLygyLjAreCk7CisJICAgIH0gZWxzZSB7CQkJLyogMTEvMTY8PXx4fDwgMTkvMTYgKi8KKwkJaWQgPSAxOyB4ICA9ICh4LW9uZSkvKHgrb25lKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmIChpeCA8IDB4NDAwMzgwMDApIHsJLyogfHh8IDwgMi40Mzc1ICovCisJCWlkID0gMjsgeCAgPSAoeC0xLjUpLyhvbmUrMS41KngpOworCSAgICB9IGVsc2UgewkJCS8qIDIuNDM3NSA8PSB8eHwgPCAyXjY2ICovCisJCWlkID0gMzsgeCAgPSAtMS4wL3g7CisJICAgIH0KKwl9fQorICAgIC8qIGVuZCBvZiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwl6ID0geCp4OworCXcgPSB6Kno7CisgICAgLyogYnJlYWsgc3VtIGZyb20gaT0wIHRvIDEwIGFUW2ldeioqKGkrMSkgaW50byBvZGQgYW5kIGV2ZW4gcG9seSAqLworCXMxID0geiooYVRbMF0rdyooYVRbMl0rdyooYVRbNF0rdyooYVRbNl0rdyooYVRbOF0rdyphVFsxMF0pKSkpKTsKKwlzMiA9IHcqKGFUWzFdK3cqKGFUWzNdK3cqKGFUWzVdK3cqKGFUWzddK3cqYVRbOV0pKSkpOworCWlmIChpZDwwKSByZXR1cm4geCAtIHgqKHMxK3MyKTsKKwllbHNlIHsKKwkgICAgeiA9IGF0YW5oaVtpZF0gLSAoKHgqKHMxK3MyKSAtIGF0YW5sb1tpZF0pIC0geCk7CisJICAgIHJldHVybiAoaHg8MCk/IC16Ono7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19hdGFuZi5jIGIvbGlibS9zcmMvc19hdGFuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MGIzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2F0YW5mLmMKQEAgLTAsMCArMSw5OSBAQAorLyogc19hdGFuZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19hdGFuLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2F0YW5mLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBhdGFuaGlbXSA9IHsKKyAgNC42MzY0NzYwMzk5ZS0wMSwgLyogYXRhbigwLjUpaGkgMHgzZWVkNjMzOCAqLworICA3Ljg1Mzk4MTI1NjVlLTAxLCAvKiBhdGFuKDEuMCloaSAweDNmNDkwZmRhICovCisgIDkuODI3OTM2ODg3N2UtMDEsIC8qIGF0YW4oMS41KWhpIDB4M2Y3Yjk4NWUgKi8KKyAgMS41NzA3OTYyNTEzZSswMCwgLyogYXRhbihpbmYpaGkgMHgzZmM5MGZkYSAqLworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGF0YW5sb1tdID0geworICA1LjAxMjE1ODI0NDBlLTA5LCAvKiBhdGFuKDAuNSlsbyAweDMxYWMzNzY5ICovCisgIDMuNzc0ODk0NzA3OWUtMDgsIC8qIGF0YW4oMS4wKWxvIDB4MzMyMjIxNjggKi8KKyAgMy40NDczMjE3MTcwZS0wOCwgLyogYXRhbigxLjUpbG8gMHgzMzE0MGZiNCAqLworICA3LjU0OTc4OTQxNTllLTA4LCAvKiBhdGFuKGluZilsbyAweDMzYTIyMTY4ICovCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgYVRbXSA9IHsKKyAgMy4zMzMzMzM0MzI3ZS0wMSwgLyogMHgzZWFhYWFhYSAqLworIC0yLjAwMDAwMDAyOThlLTAxLCAvKiAweGJlNGNjY2NkICovCisgIDEuNDI4NTcxNDkyNGUtMDEsIC8qIDB4M2UxMjQ5MjUgKi8KKyAtMS4xMTExMTEwNDQ5ZS0wMSwgLyogMHhiZGUzOGUzOCAqLworICA5LjA5MDg4NzAxMDFlLTAyLCAvKiAweDNkYmEyZTZlICovCisgLTcuNjkxODc1ODQ1MmUtMDIsIC8qIDB4YmQ5ZDg3OTUgKi8KKyAgNi42NjEwNzMxMTg0ZS0wMiwgLyogMHgzZDg4NmIzNSAqLworIC01LjgzMzU3MDI4NjZlLTAyLCAvKiAweGJkNmVmMTZiICovCisgIDQuOTc2ODc3OTQyN2UtMDIsIC8qIDB4M2Q0YmRhNTkgKi8KKyAtMy42NTMxNTcxMjk5ZS0wMiwgLyogMHhiZDE1YTIyMSAqLworICAxLjYyODU4MTk5MzNlLTAyLCAvKiAweDNjODU2OWQ3ICovCit9OworCisJc3RhdGljIGNvbnN0IGZsb2F0CitvbmUgICA9IDEuMCwKK2h1Z2UgICA9IDEuMGUzMDsKKworZmxvYXQKK2F0YW5mKGZsb2F0IHgpCit7CisJZmxvYXQgdyxzMSxzMix6OworCWludDMyX3QgaXgsaHgsaWQ7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4NTA4MDAwMDApIHsJLyogaWYgfHh8ID49IDJeMzQgKi8KKwkgICAgaWYoaXg+MHg3ZjgwMDAwMCkKKwkJcmV0dXJuIHgreDsJCS8qIE5hTiAqLworCSAgICBpZihoeD4wKSByZXR1cm4gIGF0YW5oaVszXSthdGFubG9bM107CisJICAgIGVsc2UgICAgIHJldHVybiAtYXRhbmhpWzNdLWF0YW5sb1szXTsKKwl9IGlmIChpeCA8IDB4M2VlMDAwMDApIHsJLyogfHh8IDwgMC40Mzc1ICovCisJICAgIGlmIChpeCA8IDB4MzEwMDAwMDApIHsJLyogfHh8IDwgMl4tMjkgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7CS8qIHJhaXNlIGluZXhhY3QgKi8KKwkgICAgfQorCSAgICBpZCA9IC0xOworCX0gZWxzZSB7CisJeCA9IGZhYnNmKHgpOworCWlmIChpeCA8IDB4M2Y5ODAwMDApIHsJCS8qIHx4fCA8IDEuMTg3NSAqLworCSAgICBpZiAoaXggPCAweDNmMzAwMDAwKSB7CS8qIDcvMTYgPD18eHw8MTEvMTYgKi8KKwkJaWQgPSAwOyB4ID0gKChmbG9hdCkyLjAqeC1vbmUpLygoZmxvYXQpMi4wK3gpOworCSAgICB9IGVsc2UgewkJCS8qIDExLzE2PD18eHw8IDE5LzE2ICovCisJCWlkID0gMTsgeCAgPSAoeC1vbmUpLyh4K29uZSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiAoaXggPCAweDQwMWMwMDAwKSB7CS8qIHx4fCA8IDIuNDM3NSAqLworCQlpZCA9IDI7IHggID0gKHgtKGZsb2F0KTEuNSkvKG9uZSsoZmxvYXQpMS41KngpOworCSAgICB9IGVsc2UgewkJCS8qIDIuNDM3NSA8PSB8eHwgPCAyXjY2ICovCisJCWlkID0gMzsgeCAgPSAtKGZsb2F0KTEuMC94OworCSAgICB9CisJfX0KKyAgICAvKiBlbmQgb2YgYXJndW1lbnQgcmVkdWN0aW9uICovCisJeiA9IHgqeDsKKwl3ID0geip6OworICAgIC8qIGJyZWFrIHN1bSBmcm9tIGk9MCB0byAxMCBhVFtpXXoqKihpKzEpIGludG8gb2RkIGFuZCBldmVuIHBvbHkgKi8KKwlzMSA9IHoqKGFUWzBdK3cqKGFUWzJdK3cqKGFUWzRdK3cqKGFUWzZdK3cqKGFUWzhdK3cqYVRbMTBdKSkpKSk7CisJczIgPSB3KihhVFsxXSt3KihhVFszXSt3KihhVFs1XSt3KihhVFs3XSt3KmFUWzldKSkpKTsKKwlpZiAoaWQ8MCkgcmV0dXJuIHggLSB4KihzMStzMik7CisJZWxzZSB7CisJICAgIHogPSBhdGFuaGlbaWRdIC0gKCh4KihzMStzMikgLSBhdGFubG9baWRdKSAtIHgpOworCSAgICByZXR1cm4gKGh4PDApPyAtejp6OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2JydC5jIGIvbGlibS9zcmMvc19jYnJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwMDY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2JydC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEAoIylzX2NicnQuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogT3B0aW1pemVkIGJ5IEJydWNlIEQuIEV2YW5zLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NicnQuYyx2IDEuMTAgMjAwNS8xMi8xMyAyMDoxNzoyMyBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKy8qIGNicnQoeCkKKyAqIFJldHVybiBjdWJlIHJvb3Qgb2YgeAorICovCitzdGF0aWMgY29uc3QgdV9pbnQzMl90CisJQjEgPSA3MTUwOTQxNjMsIC8qIEIxID0gKDEwMjMtMTAyMy8zLTAuMDMzMDYyMzU2NTEpKjIqKjIwICovCisJQjIgPSA2OTYyMTk3OTU7IC8qIEIyID0gKDEwMjMtMTAyMy8zLTU0LzMtMC4wMzMwNjIzNTY1MSkqMioqMjAgKi8KKworc3RhdGljIGNvbnN0IGRvdWJsZQorQyA9ICA1LjQyODU3MTQyODU3MTQyODE1OTA2ZS0wMSwgLyogMTkvMzUgICAgID0gMHgzRkUxNUYxNSwgMHhGMTVGMTVGMSAqLworRCA9IC03LjA1MzA2MTIyNDQ4OTc5NjExMDUwZS0wMSwgLyogLTg2NC8xMjI1ID0gMHhCRkU2OTFERSwgMHgyNTMyQzgzNCAqLworRSA9ICAxLjQxNDI4NTcxNDI4NTcxNDM2ODE5ZSswMCwgLyogOTkvNzAgICAgID0gMHgzRkY2QTBFQSwgMHgwRUEwRUEwRiAqLworRiA9ICAxLjYwNzE0Mjg1NzE0Mjg1NzIwNjMwZSswMCwgLyogNDUvMjggICAgID0gMHgzRkY5QjZEQiwgMHg2REI2REI2RSAqLworRyA9ICAzLjU3MTQyODU3MTQyODU3MTUwNzg3ZS0wMTsgLyogNS8xNCAgICAgID0gMHgzRkQ2REI2RCwgMHhCNkRCNkRCNyAqLworCitkb3VibGUKK2NicnQoZG91YmxlIHgpCit7CisJaW50MzJfdAloeDsKKwlkb3VibGUgcixzLHQ9MC4wLHc7CisJdV9pbnQzMl90IHNpZ247CisJdV9pbnQzMl90IGhpZ2gsbG93OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlzaWduPWh4JjB4ODAwMDAwMDA7IAkJLyogc2lnbj0gc2lnbih4KSAqLworCWh4ICBePXNpZ247CisJaWYoaHg+PTB4N2ZmMDAwMDApIHJldHVybih4K3gpOyAvKiBjYnJ0KE5hTixJTkYpIGlzIGl0c2VsZiAqLworCUdFVF9MT1dfV09SRChsb3cseCk7CisJaWYoKGh4fGxvdyk9PTApCisJICAgIHJldHVybih4KTsJCS8qIGNicnQoMCkgaXMgaXRzZWxmICovCisKKyAgICAvKgorICAgICAqIFJvdWdoIGNicnQgdG8gNSBiaXRzOgorICAgICAqICAgIGNicnQoMioqZSooMSttKSB+PSAyKiooZS8zKSooMSsoZSUzK20pLzMpCisgICAgICogd2hlcmUgZSBpcyBpbnRlZ3JhbCBhbmQgPj0gMCwgbSBpcyByZWFsIGFuZCBpbiBbMCwgMSksIGFuZCAiLyIgYW5kCisgICAgICogIiUiIGFyZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCBtb2R1bHVzIHdpdGggcm91bmRpbmcgdG93YXJkcyBtaW51cworICAgICAqIGluZmluaXR5LiAgVGhlIFJIUyBpcyBhbHdheXMgPj0gdGhlIExIUyBhbmQgaGFzIGEgbWF4aW11bSByZWxhdGl2ZQorICAgICAqIGVycm9yIG9mIGFib3V0IDEgaW4gMTYuICBBZGRpbmcgYSBiaWFzIG9mIC0wLjAzMzA2MjM1NjUxIHRvIHRoZQorICAgICAqIChlJTMrbSkvMyB0ZXJtIHJlZHVjZXMgdGhlIGVycm9yIHRvIGFib3V0IDEgaW4gMzIuIFdpdGggdGhlIElFRUUKKyAgICAgKiBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbiwgZm9yIGZpbml0ZSBwb3NpdGl2ZSBub3JtYWwgdmFsdWVzLAorICAgICAqIG9yZGluYXJ5IGludGVnZXIgZGl2aXNvbiBvZiB0aGUgdmFsdWUgaW4gYml0cyBtYWdpY2FsbHkgZ2l2ZXMKKyAgICAgKiBhbG1vc3QgZXhhY3RseSB0aGUgUkhTIG9mIHRoZSBhYm92ZSBwcm92aWRlZCB3ZSBmaXJzdCBzdWJ0cmFjdCB0aGUKKyAgICAgKiBleHBvbmVudCBiaWFzICgxMDIzIGZvciBkb3VibGVzKSBhbmQgbGF0ZXIgYWRkIGl0IGJhY2suICBXZSBkbyB0aGUKKyAgICAgKiBzdWJ0cmFjdGlvbiB2aXJ0dWFsbHkgdG8ga2VlcCBlID49IDAgc28gdGhhdCBvcmRpbmFyeSBpbnRlZ2VyCisgICAgICogZGl2aXNpb24gcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHk7IHRoaXMgaXMgYWxzbyBlZmZpY2llbnQuCisgICAgICovCisJaWYoaHg8MHgwMDEwMDAwMCkgeyAJCS8qIHN1Ym5vcm1hbCBudW1iZXIgKi8KKwkgICAgU0VUX0hJR0hfV09SRCh0LDB4NDM1MDAwMDApOyAvKiBzZXQgdD0gMioqNTQgKi8KKwkgICAgdCo9eDsKKwkgICAgR0VUX0hJR0hfV09SRChoaWdoLHQpOworCSAgICBTRVRfSElHSF9XT1JEKHQsc2lnbnwoKGhpZ2gmMHg3ZmZmZmZmZikvMytCMikpOworCX0gZWxzZQorCSAgICBTRVRfSElHSF9XT1JEKHQsc2lnbnwoaHgvMytCMSkpOworCisgICAgLyogbmV3IGNicnQgdG8gMjMgYml0czsgbWF5IGJlIGltcGxlbWVudGVkIGluIHNpbmdsZSBwcmVjaXNpb24gKi8KKwlyPXQqdC94OworCXM9QytyKnQ7CisJdCo9RytGLyhzK0UrRC9zKTsKKworICAgIC8qIGNob3AgdCB0byAyMCBiaXRzIGFuZCBtYWtlIGl0IGxhcmdlciBpbiBtYWduaXR1ZGUgdGhhbiBjYnJ0KHgpICovCisJR0VUX0hJR0hfV09SRChoaWdoLHQpOworCUlOU0VSVF9XT1JEUyh0LGhpZ2grMHgwMDAwMDAwMSwwKTsKKworICAgIC8qIG9uZSBzdGVwIE5ld3RvbiBpdGVyYXRpb24gdG8gNTMgYml0cyB3aXRoIGVycm9yIGxlc3MgdGhhbiAwLjY2NyB1bHBzICovCisJcz10KnQ7CQkvKiB0KnQgaXMgZXhhY3QgKi8KKwlyPXgvczsKKwl3PXQrdDsKKwlyPShyLXQpLyh3K3IpOwkvKiByLXQgaXMgZXhhY3QgKi8KKwl0PXQrdCpyOworCisJcmV0dXJuKHQpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jYnJ0Zi5jIGIvbGlibS9zcmMvc19jYnJ0Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTY5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NicnRmLmMKQEAgLTAsMCArMSw3OSBAQAorLyogc19jYnJ0Zi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jYnJ0LmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIERlYnVnZ2VkIGFuZCBvcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jYnJ0Zi5jLHYgMS4xMiAyMDA1LzEyLzEzIDIwOjE3OjIzIGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworLyogY2JydGYoeCkKKyAqIFJldHVybiBjdWJlIHJvb3Qgb2YgeAorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQKKwlCMSA9IDcwOTk1ODEzMCwgLyogQjEgPSAoMTI3LTEyNy4wLzMtMC4wMzMwNjIzNTY1MSkqMioqMjMgKi8KKwlCMiA9IDY0Mjg0OTI2NjsgLyogQjIgPSAoMTI3LTEyNy4wLzMtMjQvMy0wLjAzMzA2MjM1NjUxKSoyKioyMyAqLworCitzdGF0aWMgY29uc3QgZmxvYXQKK0MgPSAgNS40Mjg1NzE3MDEwZS0wMSwgLyogMTkvMzUgICAgID0gMHgzZjBhZjhiMCAqLworRCA9IC03LjA1MzA2MTEyNzdlLTAxLCAvKiAtODY0LzEyMjUgPSAweGJmMzQ4ZWYxICovCitFID0gIDEuNDE0Mjg1NjU5OGUrMDAsIC8qIDk5LzcwICAgICA9IDB4M2ZiNTA3NTAgKi8KK0YgPSAgMS42MDcxNDI4MDYxZSswMCwgLyogNDUvMjggICAgID0gMHgzZmNkYjZkYiAqLworRyA9ICAzLjU3MTQyODY1NjZlLTAxOyAvKiA1LzE0ICAgICAgPSAweDNlYjZkYjZlICovCisKK2Zsb2F0CitjYnJ0ZihmbG9hdCB4KQoreworCWZsb2F0IHIscyx0LHc7CisJaW50MzJfdCBoeDsKKwl1X2ludDMyX3Qgc2lnbjsKKwl1X2ludDMyX3QgaGlnaDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCXNpZ249aHgmMHg4MDAwMDAwMDsgCQkvKiBzaWduPSBzaWduKHgpICovCisJaHggIF49c2lnbjsKKwlpZihoeD49MHg3ZjgwMDAwMCkgcmV0dXJuKHgreCk7IC8qIGNicnQoTmFOLElORikgaXMgaXRzZWxmICovCisJaWYoaHg9PTApCisJICAgIHJldHVybih4KTsJCS8qIGNicnQoMCkgaXMgaXRzZWxmICovCisKKyAgICAvKiByb3VnaCBjYnJ0IHRvIDUgYml0cyAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsgCQkvKiBzdWJub3JtYWwgbnVtYmVyICovCisJICAgIFNFVF9GTE9BVF9XT1JEKHQsMHg0YjgwMDAwMCk7IC8qIHNldCB0PSAyKioyNCAqLworCSAgICB0Kj14OworCSAgICBHRVRfRkxPQVRfV09SRChoaWdoLHQpOworCSAgICBTRVRfRkxPQVRfV09SRCh0LHNpZ258KChoaWdoJjB4N2ZmZmZmZmYpLzMrQjIpKTsKKwl9IGVsc2UKKwkgICAgU0VUX0ZMT0FUX1dPUkQodCxzaWdufChoeC8zK0IxKSk7CisKKyAgICAvKiBuZXcgY2JydCB0byAyMyBiaXRzICovCisJcj10KnQveDsKKwlzPUMrcip0OworCXQqPUcrRi8ocytFK0Qvcyk7CisKKyAgICAvKiBjaG9wIHQgdG8gMTIgYml0cyBhbmQgbWFrZSBpdCBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gY2JydCh4KSAqLworCUdFVF9GTE9BVF9XT1JEKGhpZ2gsdCk7CisJU0VUX0ZMT0FUX1dPUkQodCwoaGlnaCYweGZmZmZmMDAwKSsweDAwMDAxMDAwKTsKKworICAgIC8qIG9uZSBzdGVwIE5ld3RvbiBpdGVyYXRpb24gdG8gMjQgYml0cyB3aXRoIGVycm9yIGxlc3MgdGhhbiAwLjY2NyB1bHBzICovCisJcz10KnQ7CQkvKiB0KnQgaXMgZXhhY3QgKi8KKwlyPXgvczsKKwl3PXQrdDsKKwlyPShyLXQpLyh3K3IpOwkvKiByLXQgaXMgZXhhY3QgKi8KKwl0PXQrdCpyOworCisJcmV0dXJuKHQpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jZWlsLmMgYi9saWJtL3NyYy9zX2NlaWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jZWlsLmMKQEAgLTAsMCArMSw3MiBAQAorLyogQCgjKXNfY2VpbC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jZWlsLmMsdiAxLjkgMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGNlaWwoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGNlaWwoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworZG91YmxlCitjZWlsKGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGksajsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA8MCkge2kwPTB4ODAwMDAwMDA7aTE9MDt9CisJCSAgICBlbHNlIGlmKChpMHxpMSkhPTApIHsgaTA9MHgzZmYwMDAwMDtpMT0wO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMD4wKSBpMCArPSAoMHgwMDEwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsgaTE9MDsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpZihodWdlK3g+MC4wKSB7IAkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCWlmKGkwPjApIHsKKwkJICAgIGlmKGowPT0yMCkgaTArPTE7CisJCSAgICBlbHNlIHsKKwkJCWogPSBpMSArICgxPDwoNTItajApKTsKKwkJCWlmKGo8aTEpIGkwKz0xOwkvKiBnb3QgYSBjYXJyeSAqLworCQkJaTEgPSBqOworCQkgICAgfQorCQl9CisJCWkxICY9ICh+aSk7CisJICAgIH0KKwl9CisJSU5TRVJUX1dPUkRTKHgsaTAsaTEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jZWlsZi5jIGIvbGlibS9zcmMvc19jZWlsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NlaWxmLmMKQEAgLTAsMCArMSw1MyBAQAorLyogc19jZWlsZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19jZWlsLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NlaWxmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBodWdlID0gMS4wZTMwOworCitmbG9hdAorY2VpbGYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGkwLGowOworCXVfaW50MzJfdCBpOworCisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsKKwlpZihqMDwyMykgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgey8qIHJldHVybiAwKnNpZ24oeCkgaWYgfHh8PDEgKi8KKwkJICAgIGlmKGkwPDApIHtpMD0weDgwMDAwMDAwO30KKwkJICAgIGVsc2UgaWYoaTAhPTApIHsgaTA9MHgzZjgwMDAwMDt9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwN2ZmZmZmKT4+ajA7CisJCWlmKChpMCZpKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PihmbG9hdCkwLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMD4wKSBpMCArPSAoMHgwMDgwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxpMCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NlaWxsLmMgYi9saWJtL3NyYy9zX2NlaWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4ODE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2VpbGwuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBGcm9tOiBAKCMpc19jZWlsLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2VpbGwuYyx2IDEuNCAyMDA1LzA0LzI4IDE5OjQ1OjU1IHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjZWlsbCh4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gY2VpbGwoeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCU1BTkhfU0laRQlMREJMX01BTkhfU0laRQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pIHsJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorCQl1LmJpdHMubWFuaCB8PSAxbGx1IDw8IChMREJMX01BTkhfU0laRSAtIDEpOwlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworbG9uZyBkb3VibGUKK2NlaWxsKGxvbmcgZG91YmxlIHgpCit7CisJdW5pb24gSUVFRWwyYml0cyB1ID0geyAuZSA9IHggfTsKKwlpbnQgZSA9IHUuYml0cy5leHAgLSBMREJMX01BWF9FWFAgKyAxOworCisJaWYgKGUgPCBNQU5IX1NJWkUgLSAxKSB7CisJCWlmIChlIDwgMCkgewkJCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCQlpZiAoaHVnZSArIHggPiAwLjApCisJCQkJaWYgKHUuYml0cy5leHAgPiAwIHx8CisJCQkJICAgICh1LmJpdHMubWFuaCB8IHUuYml0cy5tYW5sKSAhPSAwKQorCQkJCQl1LmUgPSB1LmJpdHMuc2lnbiA/IDAuMCA6IDEuMDsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ2NF90IG0gPSAoKDFsbHUgPDwgTUFOSF9TSVpFKSAtIDEpID4+IChlICsgMSk7CisJCQlpZiAoKCh1LmJpdHMubWFuaCAmIG0pIHwgdS5iaXRzLm1hbmwpID09IDApCisJCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQkJaWYgKCF1LmJpdHMuc2lnbikgeworI2lmZGVmIExEQkxfSU1QTElDSVRfTkJJVAorCQkJCWlmIChlID09IDApCisJCQkJCXUuYml0cy5leHArKzsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQlJTkNfTUFOSCh1LCAxbGx1IDw8IChNQU5IX1NJWkUgLSBlIC0gMSkpOworCQkJfQorCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKSB7CS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQkJCXUuYml0cy5tYW5oICY9IH5tOworCQkJCXUuYml0cy5tYW5sID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZSA8IExEQkxfTUFOVF9ESUcgLSAxKSB7CisJCXVpbnQ2NF90IG0gPSAodWludDY0X3QpLTEgPj4gKDY0IC0gTERCTF9NQU5UX0RJRyArIGUgKyAxKTsKKwkJaWYgKCh1LmJpdHMubWFubCAmIG0pID09IDApCisJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCWlmICghdS5iaXRzLnNpZ24pIHsKKwkJCWlmIChlID09IE1BTkhfU0laRSAtIDEpCisJCQkJSU5DX01BTkgodSwgMSk7CisJCQllbHNlIHsKKwkJCQl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmw7CisJCQkJdS5iaXRzLm1hbmwgKz0gMWxsdSA8PCAoTERCTF9NQU5UX0RJRyAtIGUgLSAxKTsKKwkJCQlpZiAodS5iaXRzLm1hbmwgPCBvKQkvKiBnb3QgYSBjYXJyeSAqLworCQkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NpbWFnLmMgYi9saWJtL3NyYy9zX2NpbWFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2ltYWcuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jaW1hZy5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2RvdWJsZQorY2ltYWcoZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gLXogKiBJOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jaW1hZ2YuYyBiL2xpYm0vc3JjL3NfY2ltYWdmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwZjUzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY2ltYWdmLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY2ltYWdmLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZmxvYXQKK2NpbWFnZihmbG9hdCBjb21wbGV4IHopCit7CisJcmV0dXJuIC16ICogSTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY2ltYWdsLmMgYi9saWJtL3NyYy9zX2NpbWFnbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzY3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NpbWFnbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NpbWFnbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2xvbmcgZG91YmxlCitjaW1hZ2wobG9uZyBkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiAteiAqIEk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvbmouYyBiL2xpYm0vc3JjL3NfY29uai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2ExNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvbmouYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb25qLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworZG91YmxlIGNvbXBsZXgKK2NvbmooZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gY3JlYWwoeikgLSBJICogY2ltYWcoeik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NvbmpmLmMgYi9saWJtL3NyYy9zX2NvbmpmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlMDM5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY29uamYuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb25qZi5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2Zsb2F0IGNvbXBsZXgKK2NvbmpmKGZsb2F0IGNvbXBsZXggeikKK3sKKwlyZXR1cm4gY3JlYWxmKHopIC0gSSAqIGNpbWFnZih6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29uamwuYyBiL2xpYm0vc3JjL3NfY29uamwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q4MGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb25qbC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvbmpsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworbG9uZyBkb3VibGUgY29tcGxleAorY29uamwobG9uZyBkb3VibGUgY29tcGxleCB6KQoreworCXJldHVybiBjcmVhbGwoeikgLSBJICogY2ltYWdsKHopOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3B5c2lnbi5jIGIvbGlibS9zcmMvc19jb3B5c2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2JlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWduLmMKQEAgLTAsMCArMSwzNCBAQAorLyogQCgjKXNfY29weXNpZ24uYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29weXNpZ24uYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQorICogY29weXNpZ24oeCx5KSByZXR1cm5zIGEgdmFsdWUgd2l0aCB0aGUgbWFnbml0dWRlIG9mIHggYW5kCisgKiB3aXRoIHRoZSBzaWduIGJpdCBvZiB5LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQoreworCXVfaW50MzJfdCBoeCxoeTsKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCUdFVF9ISUdIX1dPUkQoaHkseSk7CisJU0VUX0hJR0hfV09SRCh4LChoeCYweDdmZmZmZmZmKXwoaHkmMHg4MDAwMDAwMCkpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29weXNpZ25mLmMgYi9saWJtL3NyYy9zX2NvcHlzaWduZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzQ0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWduZi5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIHNfY29weXNpZ25mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2NvcHlzaWduLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvcHlzaWduZi5jLHYgMS45IDIwMDMvMDcvMjMgMDQ6NTM6NDYgcGV0ZXIgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBjb3B5c2lnbmYoZmxvYXQgeCwgZmxvYXQgeSkKKyAqIGNvcHlzaWduZih4LHkpIHJldHVybnMgYSB2YWx1ZSB3aXRoIHRoZSBtYWduaXR1ZGUgb2YgeCBhbmQKKyAqIHdpdGggdGhlIHNpZ24gYml0IG9mIHkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2NvcHlzaWduZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVfaW50MzJfdCBpeCxpeTsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlHRVRfRkxPQVRfV09SRChpeSx5KTsKKwlTRVRfRkxPQVRfV09SRCh4LChpeCYweDdmZmZmZmZmKXwoaXkmMHg4MDAwMDAwMCkpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY29weXNpZ25sLmMgYi9saWJtL3NyYy9zX2NvcHlzaWdubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWJkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NvcHlzaWdubC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NvcHlzaWdubC5jLHYgMS4xIDIwMDQvMDUvMDcgMTg6NTY6MzEgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2NvcHlzaWdubChsb25nIGRvdWJsZSB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdXgsIHV5OworCisJdXguZSA9IHg7CisJdXkuZSA9IHk7CisJdXguYml0cy5zaWduID0gdXkuYml0cy5zaWduOworCXJldHVybiAodXguZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Nvcy5jIGIvbGlibS9zcmMvc19jb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFmOTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3MuYwpAQCAtMCwwICsxLDgyIEBACisvKiBAKCMpc19jb3MuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY29zLmMsdiAxLjEwIDIwMDUvMTAvMjQgMTQ6MDg6MzYgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBjb3MoeCkKKyAqIFJldHVybiBjb3NpbmUgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBrZXJuZWwgZnVuY3Rpb246CisgKglfX2tlcm5lbF9zaW4JCS4uLiBzaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19rZXJuZWxfY29zCQkuLi4gY29zaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19pZWVlNzU0X3JlbV9waW8yCS4uLiBhcmd1bWVudCByZWR1Y3Rpb24gcm91dGluZQorICoKKyAqIE1ldGhvZC4KKyAqICAgICAgTGV0IFMsQyBhbmQgVCBkZW5vdGUgdGhlIHNpbiwgY29zIGFuZCB0YW4gcmVzcGVjdGl2ZWx5IG9uCisgKglbLVBJLzQsICtQSS80XS4gUmVkdWNlIHRoZSBhcmd1bWVudCB4IHRvIHkxK3kyID0geC1rKnBpLzIKKyAqCWluIFstcGkvNCAsICtwaS80XSwgYW5kIGxldCBuID0gayBtb2QgNC4KKyAqCVdlIGhhdmUKKyAqCisgKiAgICAgICAgICBuICAgICAgICBzaW4oeCkgICAgICBjb3MoeCkgICAgICAgIHRhbih4KQorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCSAgICAwCSAgICAgICBTCSAgIEMJCSBUCisgKgkgICAgMQkgICAgICAgQwkgIC1TCQktMS9UCisgKgkgICAgMgkgICAgICAtUwkgIC1DCQkgVAorICoJICAgIDMJICAgICAgLUMJICAgUwkJLTEvVAorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICogICAgICBMZXQgdHJpZyBiZSBhbnkgb2Ygc2luLCBjb3MsIG9yIHRhbi4KKyAqICAgICAgdHJpZygrLUlORikgIGlzIE5hTiwgd2l0aCBzaWduYWxzOworICogICAgICB0cmlnKE5hTikgICAgaXMgdGhhdCBOYU47CisgKgorICogQWNjdXJhY3k6CisgKglUUklHKHgpIHJldHVybnMgdHJpZyh4KSBuZWFybHkgcm91bmRlZAorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorY29zKGRvdWJsZSB4KQoreworCWRvdWJsZSB5WzJdLHo9MC4wOworCWludDMyX3QgbiwgaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgeC4gKi8KKwlHRVRfSElHSF9XT1JEKGl4LHgpOworCisgICAgLyogfHh8IH48IHBpLzQgKi8KKwlpeCAmPSAweDdmZmZmZmZmOworCWlmKGl4IDw9IDB4M2ZlOTIxZmIpIHsKKwkgICAgaWYoaXg8MHgzZTQwMDAwMCkJCQkvKiBpZiB4IDwgMioqLTI3ICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4gMS4wOwkvKiBnZW5lcmF0ZSBpbmV4YWN0ICovCisJICAgIHJldHVybiBfX2tlcm5lbF9jb3MoeCx6KTsKKwl9CisKKyAgICAvKiBjb3MoSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJCWNhc2UgMTogcmV0dXJuIC1fX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCQljYXNlIDI6IHJldHVybiAtX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJCWRlZmF1bHQ6CisJCSAgICAgICAgcmV0dXJuICBfX2tlcm5lbF9zaW4oeVswXSx5WzFdLDEpOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jb3NmLmMgYi9saWJtL3NyYy9zX2Nvc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFkYWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19jb3NmLmMKQEAgLTAsMCArMSw4NCBAQAorLyogc19jb3NmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2Nvcy5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jb3NmLmMsdiAxLjE1IDIwMDUvMTEvMzAgMDY6NDc6MTggYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX0NPU0RGCisjZGVmaW5lCUlOTElORV9LRVJORUxfU0lOREYKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJrX2Nvc2YuYyIKKyNpbmNsdWRlICJrX3NpbmYuYyIKKworLyogU21hbGwgbXVsdGlwbGVzIG9mIHBpLzIgcm91bmRlZCB0byBkb3VibGUgcHJlY2lzaW9uLiAqLworc3RhdGljIGNvbnN0IGRvdWJsZQorYzFwaW8yID0gMSpNX1BJXzIsCQkJLyogMHgzRkY5MjFGQiwgMHg1NDQ0MkQxOCAqLworYzJwaW8yID0gMipNX1BJXzIsCQkJLyogMHg0MDA5MjFGQiwgMHg1NDQ0MkQxOCAqLworYzNwaW8yID0gMypNX1BJXzIsCQkJLyogMHg0MDEyRDk3QywgMHg3RjMzMjFEMiAqLworYzRwaW8yID0gNCpNX1BJXzI7CQkJLyogMHg0MDE5MjFGQiwgMHg1NDQ0MkQxOCAqLworCitmbG9hdAorY29zZihmbG9hdCB4KQoreworCWZsb2F0IHlbMl07CisJaW50MzJfdCBuLCBoeCwgaXg7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsKKworCWlmKGl4IDw9IDB4M2Y0OTBmZGEpIHsJCS8qIHx4fCB+PD0gcGkvNCAqLworCSAgICBpZihpeDwweDM5ODAwMDAwKQkJLyogfHh8IDwgMioqLTEyICovCisJCWlmKCgoaW50KXgpPT0wKSByZXR1cm4gMS4wOwkvKiAxIHdpdGggaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHgpOworCX0KKwlpZihpeDw9MHg0MDdiNTNkMSkgewkJLyogfHh8IH48PSA1KnBpLzQgKi8KKwkgICAgaWYoaXg+MHg0MDE2Y2JlMykJCS8qIHx4fCAgfj4gMypwaS80ICovCisJCXJldHVybiAtX19rZXJuZWxfY29zZGYoeCArIChoeCA+IDAgPyAtYzJwaW8yIDogYzJwaW8yKSk7CisJICAgIGVsc2UgeworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKGMxcGlvMiAtIHgpOworCQllbHNlCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoeCArIGMxcGlvMik7CisJICAgIH0KKwl9CisJaWYoaXg8PTB4NDBlMjMxZDUpIHsJCS8qIHx4fCB+PD0gOSpwaS80ICovCisJICAgIGlmKGl4PjB4NDBhZmVkZGYpCQkvKiB8eHwgIH4+IDcqcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfY29zZGYoeCArIChoeCA+IDAgPyAtYzRwaW8yIDogYzRwaW8yKSk7CisJICAgIGVsc2UgeworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHggLSBjM3BpbzIpOworCQllbHNlCisJCSAgICByZXR1cm4gX19rZXJuZWxfc2luZGYoLWMzcGlvMiAtIHgpOworCSAgICB9CisJfQorCisgICAgLyogY29zKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmODAwMDAwKSByZXR1cm4geC14OworCisgICAgLyogZ2VuZXJhbCBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzJmKHgseSk7CisJICAgIHN3aXRjaChuJjMpIHsKKwkJY2FzZSAwOiByZXR1cm4gIF9fa2VybmVsX2Nvc2RmKChkb3VibGUpeVswXSt5WzFdKTsKKwkJY2FzZSAxOiByZXR1cm4gIF9fa2VybmVsX3NpbmRmKC0oZG91YmxlKXlbMF0teVsxXSk7CisJCWNhc2UgMjogcmV0dXJuIC1fX2tlcm5lbF9jb3NkZigoZG91YmxlKXlbMF0reVsxXSk7CisJCWRlZmF1bHQ6CisJCSAgICAgICAgcmV0dXJuICBfX2tlcm5lbF9zaW5kZigoZG91YmxlKXlbMF0reVsxXSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2NyZWFsLmMgYi9saWJtL3NyYy9zX2NyZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNGNkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY3JlYWwuYwpAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBTdGVmYW4gRmFyZmVsZWRlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19jcmVhbC5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2RvdWJsZQorY3JlYWwoZG91YmxlIGNvbXBsZXggeikKK3sKKwlyZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfY3JlYWxmLmMgYi9saWJtL3NyYy9zX2NyZWFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzE1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2NyZWFsZi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IFN0ZWZhbiBGYXJmZWxlZGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2NyZWFsZi5jLHYgMS4xIDIwMDQvMDUvMzAgMDk6MjE6NTYgc3RlZmFuZiBFeHAgJAorICovCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CisKK2Zsb2F0CitjcmVhbGYoZmxvYXQgY29tcGxleCB6KQoreworCXJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19jcmVhbGwuYyBiL2xpYm0vc3JjL3NfY3JlYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMWQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfY3JlYWxsLmMKQEAgLTAsMCArMSwzNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU3RlZmFuIEZhcmZlbGVkZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfY3JlYWxsLmMsdiAxLjEgMjAwNC8wNS8zMCAwOToyMTo1NiBzdGVmYW5mIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGNvbXBsZXguaD4KKworbG9uZyBkb3VibGUKK2NyZWFsbChsb25nIGRvdWJsZSBjb21wbGV4IHopCit7CisJcmV0dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2VyZi5jIGIvbGlibS9zcmMvc19lcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19lcmYuYwpAQCAtMCwwICsxLDMwMiBAQAorLyogQCgjKXNfZXJmLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2VyZi5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBkb3VibGUgZXJmKGRvdWJsZSB4KQorICogZG91YmxlIGVyZmMoZG91YmxlIHgpCisgKgkJCSAgICAgeAorICoJCSAgICAgIDIgICAgICB8XAorICogICAgIGVyZih4KSAgPSAgLS0tLS0tLS0tICB8IGV4cCgtdCp0KWR0CisgKgkgCSAgIHNxcnQocGkpIFx8CisgKgkJCSAgICAgMAorICoKKyAqICAgICBlcmZjKHgpID0gIDEtZXJmKHgpCisgKiAgTm90ZSB0aGF0CisgKgkJZXJmKC14KSA9IC1lcmYoeCkKKyAqCQllcmZjKC14KSA9IDIgLSBlcmZjKHgpCisgKgorICogTWV0aG9kOgorICoJMS4gRm9yIHx4fCBpbiBbMCwgMC44NDM3NV0KKyAqCSAgICBlcmYoeCkgID0geCArIHgqUih4XjIpCisgKiAgICAgICAgICBlcmZjKHgpID0gMSAtIGVyZih4KSAgICAgICAgICAgaWYgeCBpbiBbLS44NDM3NSwwLjI1XQorICogICAgICAgICAgICAgICAgICA9IDAuNSArICgoMC41LXgpLXgqUikgIGlmIHggaW4gWzAuMjUsMC44NDM3NV0KKyAqCSAgIHdoZXJlIFIgPSBQL1Egd2hlcmUgUCBpcyBhbiBvZGQgcG9seSBvZiBkZWdyZWUgOCBhbmQKKyAqCSAgIFEgaXMgYW4gb2RkIHBvbHkgb2YgZGVncmVlIDEwLgorICoJCQkJCQkgLTU3LjkwCisgKgkJCXwgUiAtIChlcmYoeCkteCkveCB8IDw9IDIKKyAqCisgKgorICoJICAgUmVtYXJrLiBUaGUgZm9ybXVsYSBpcyBkZXJpdmVkIGJ5IG5vdGluZworICogICAgICAgICAgZXJmKHgpID0gKDIvc3FydChwaSkpKih4IC0geF4zLzMgKyB4XjUvMTAgLSB4XjcvNDIgKyAuLi4uKQorICoJICAgYW5kIHRoYXQKKyAqICAgICAgICAgIDIvc3FydChwaSkgPSAxLjEyODM3OTE2NzA5NTUxMjU3Mzg5NjE1ODkwMzEyMTU0NTE3MTY4OAorICoJICAgaXMgY2xvc2UgdG8gb25lLiBUaGUgaW50ZXJ2YWwgaXMgY2hvc2VuIGJlY2F1c2UgdGhlIGZpeAorICoJICAgcG9pbnQgb2YgZXJmKHgpIGlzIG5lYXIgMC42MTc0IChpLmUuLCBlcmYoeCk9eCB3aGVuIHggaXMKKyAqCSAgIG5lYXIgMC42MTc0KSwgYW5kIGJ5IHNvbWUgZXhwZXJpbWVudCwgMC44NDM3NSBpcyBjaG9zZW4gdG8KKyAqIAkgICBndWFyYW50ZWUgdGhlIGVycm9yIGlzIGxlc3MgdGhhbiBvbmUgdWxwIGZvciBlcmYuCisgKgorICogICAgICAyLiBGb3IgfHh8IGluIFswLjg0Mzc1LDEuMjVdLCBsZXQgcyA9IHx4fCAtIDEsIGFuZAorICogICAgICAgICBjID0gMC44NDUwNjI5MTE1MSByb3VuZGVkIHRvIHNpbmdsZSAoMjQgYml0cykKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpICogKGMgICsgUDEocykvUTEocykpCisgKiAgICAgICAgIAllcmZjKHgpID0gKDEtYykgIC0gUDEocykvUTEocykgaWYgeCA+IDAKKyAqCQkJICAxKyhjK1AxKHMpL1ExKHMpKSAgICBpZiB4IDwgMAorICogICAgICAgICAJfFAxL1ExIC0gKGVyZih8eHwpLWMpfCA8PSAyKiotNTkuMDYKKyAqCSAgIFJlbWFyazogaGVyZSB3ZSB1c2UgdGhlIHRheWxvciBzZXJpZXMgZXhwYW5zaW9uIGF0IHg9MS4KKyAqCQllcmYoMStzKSA9IGVyZigxKSArIHMqUG9seShzKQorICoJCQkgPSAwLjg0NS4uICsgUDEocykvUTEocykKKyAqCSAgIFRoYXQgaXMsIHdlIHVzZSByYXRpb25hbCBhcHByb3hpbWF0aW9uIHRvIGFwcHJveGltYXRlCisgKgkJCWVyZigxK3MpIC0gKGMgPSAoc2luZ2xlKTAuODQ1MDYyOTExNTEpCisgKgkgICBOb3RlIHRoYXQgfFAxL1ExfDwgMC4wNzggZm9yIHggaW4gWzAuODQzNzUsMS4yNV0KKyAqCSAgIHdoZXJlCisgKgkJUDEocykgPSBkZWdyZWUgNiBwb2x5IGluIHMKKyAqCQlRMShzKSA9IGRlZ3JlZSA2IHBvbHkgaW4gcworICoKKyAqICAgICAgMy4gRm9yIHggaW4gWzEuMjUsMS8wLjM1KH4yLjg1NzE0MyldLAorICogICAgICAgICAJZXJmYyh4KSA9ICgxL3gpKmV4cCgteCp4LTAuNTYyNStSMS9TMSkKKyAqICAgICAgICAgCWVyZih4KSAgPSAxIC0gZXJmYyh4KQorICoJICAgd2hlcmUKKyAqCQlSMSh6KSA9IGRlZ3JlZSA3IHBvbHkgaW4geiwgKHo9MS94XjIpCisgKgkJUzEoeikgPSBkZWdyZWUgOCBwb2x5IGluIHoKKyAqCisgKiAgICAgIDQuIEZvciB4IGluIFsxLzAuMzUsMjhdCisgKiAgICAgICAgIAllcmZjKHgpID0gKDEveCkqZXhwKC14KngtMC41NjI1K1IyL1MyKSBpZiB4ID4gMAorICoJCQk9IDIuMCAtICgxL3gpKmV4cCgteCp4LTAuNTYyNStSMi9TMikgaWYgLTY8eDwwCisgKgkJCT0gMi4wIC0gdGlueQkJKGlmIHggPD0gLTYpCisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSooMS4wIC0gZXJmYyh4KSkgaWYgeCA8IDYsIGVsc2UKKyAqICAgICAgICAgCWVyZih4KSAgPSBzaWduKHgpKigxLjAgLSB0aW55KQorICoJICAgd2hlcmUKKyAqCQlSMih6KSA9IGRlZ3JlZSA2IHBvbHkgaW4geiwgKHo9MS94XjIpCisgKgkJUzIoeikgPSBkZWdyZWUgNyBwb2x5IGluIHoKKyAqCisgKiAgICAgIE5vdGUxOgorICoJICAgVG8gY29tcHV0ZSBleHAoLXgqeC0wLjU2MjUrUi9TKSwgbGV0IHMgYmUgYSBzaW5nbGUKKyAqCSAgIHByZWNpc2lvbiBudW1iZXIgYW5kIHMgOj0geDsgdGhlbgorICoJCS14KnggPSAtcypzICsgKHMteCkqKHMreCkKKyAqCSAgICAgICAgZXhwKC14KngtMC41NjI2K1IvUykgPQorICoJCQlleHAoLXMqcy0wLjU2MjUpKmV4cCgocy14KSoocyt4KStSL1MpOworICogICAgICBOb3RlMjoKKyAqCSAgIEhlcmUgNCBhbmQgNSBtYWtlIHVzZSBvZiB0aGUgYXN5bXB0b3RpYyBzZXJpZXMKKyAqCQkJICBleHAoLXgqeCkKKyAqCQllcmZjKHgpIH4gLS0tLS0tLS0tLSAqICggMSArIFBvbHkoMS94XjIpICkKKyAqCQkJICB4KnNxcnQocGkpCisgKgkgICBXZSB1c2UgcmF0aW9uYWwgYXBwcm94aW1hdGlvbiB0byBhcHByb3hpbWF0ZQorICogICAgICAJZyhzKT1mKDEveF4yKSA9IGxvZyhlcmZjKHgpKngpIC0geCp4ICsgMC41NjI1CisgKgkgICBIZXJlIGlzIHRoZSBlcnJvciBib3VuZCBmb3IgUjEvUzEgYW5kIFIyL1MyCisgKiAgICAgIAl8UjEvUzEgLSBmKHgpfCAgPCAyKiooLTYyLjU3KQorICogICAgICAJfFIyL1MyIC0gZih4KXwgIDwgMioqKC02MS41MikKKyAqCisgKiAgICAgIDUuIEZvciBpbmYgPiB4ID49IDI4CisgKiAgICAgICAgIAllcmYoeCkgID0gc2lnbih4KSAqKDEgLSB0aW55KSAgKHJhaXNlIGluZXhhY3QpCisgKiAgICAgICAgIAllcmZjKHgpID0gdGlueSp0aW55IChyYWlzZSB1bmRlcmZsb3cpIGlmIHggPiAwCisgKgkJCT0gMiAtIHRpbnkgaWYgeDwwCisgKgorICogICAgICA3LiBTcGVjaWFsIGNhc2U6CisgKiAgICAgICAgIAllcmYoMCkgID0gMCwgZXJmKGluZikgID0gMSwgZXJmKC1pbmYpID0gLTEsCisgKiAgICAgICAgIAllcmZjKDApID0gMSwgZXJmYyhpbmYpID0gMCwgZXJmYygtaW5mKSA9IDIsCisgKgkgICAJZXJmYy9lcmYoTmFOKSBpcyBOYU4KKyAqLworCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK3RpbnkJICAgID0gMWUtMzAwLAoraGFsZj0gIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTAxLCAvKiAweDNGRTAwMDAwLCAweDAwMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAsIC8qIDB4M0ZGMDAwMDAsIDB4MDAwMDAwMDAgKi8KK3R3byA9ICAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSswMCwgLyogMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCAqLworCS8qIGMgPSAoZmxvYXQpMC44NDUwNjI5MTE1MSAqLworZXJ4ID0gIDguNDUwNjI5MTE1MTA0Njc1MjkyOTdlLTAxLCAvKiAweDNGRUIwQUMxLCAweDYwMDAwMDAwICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgb24gWzAsMC44NDM3NV0KKyAqLworZWZ4ID0gIDEuMjgzNzkxNjcwOTU1MTI1ODYzMTZlLTAxLCAvKiAweDNGQzA2RUJBLCAweDgyMTREQjY5ICovCitlZng4PSAgMS4wMjcwMzMzMzY3NjQxMDA2OTA1M2UrMDAsIC8qIDB4M0ZGMDZFQkEsIDB4ODIxNERCNjkgKi8KK3BwMCAgPSAgMS4yODM3OTE2NzA5NTUxMjU1ODU2MWUtMDEsIC8qIDB4M0ZDMDZFQkEsIDB4ODIxNERCNjggKi8KK3BwMSAgPSAtMy4yNTA0MjEwNzI0NzAwMTQ5OTM3MGUtMDEsIC8qIDB4QkZENENEN0QsIDB4NjkxQ0I5MTMgKi8KK3BwMiAgPSAtMi44NDgxNzQ5NTc1NTk4NTEwNDc2NmUtMDIsIC8qIDB4QkY5RDJBNTEsIDB4REJENzE5NEYgKi8KK3BwMyAgPSAtNS43NzAyNzAyOTY0ODk0NDE1OTE1N2UtMDMsIC8qIDB4QkY3N0EyOTEsIDB4MjM2NjY4RTQgKi8KK3BwNCAgPSAtMi4zNzYzMDE2NjU2NjUwMTYyNjA4NGUtMDUsIC8qIDB4QkVGOEVBRDYsIDB4MTIwMDE2QUMgKi8KK3FxMSAgPSAgMy45NzkxNzIyMzk1OTE1NTM1MjgxOWUtMDEsIC8qIDB4M0ZEOTc3NzksIDB4Q0REQURDMDkgKi8KK3FxMiAgPSAgNi41MDIyMjQ5OTg4NzY3Mjk0NDQ4NWUtMDIsIC8qIDB4M0ZCMEE1NEMsIDB4NTUzNkNFQkEgKi8KK3FxMyAgPSAgNS4wODEzMDYyODE4NzU3NjU2Mjc3NmUtMDMsIC8qIDB4M0Y3NEQwMjIsIDB4QzREMzZCMEYgKi8KK3FxNCAgPSAgMS4zMjQ5NDczODAwNDMyMTY0NDUyNmUtMDQsIC8qIDB4M0YyMTVEQzksIDB4MjIxQzFBMTAgKi8KK3FxNSAgPSAtMy45NjAyMjgyNzg3NzUzNjgxMjMyMGUtMDYsIC8qIDB4QkVEMDlDNDMsIDB4NDJBMjYxMjAgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiAgaW4gWzAuODQzNzUsMS4yNV0KKyAqLworcGEwICA9IC0yLjM2MjExODU2MDc1MjY1OTQ0MDc3ZS0wMywgLyogMHhCRjYzNTlCOCwgMHhCRUY3NzUzOCAqLworcGExICA9ICA0LjE0ODU2MTE4NjgzNzQ4MzMxNjY2ZS0wMSwgLyogMHgzRkRBOEQwMCwgMHhBRDkyQjM0RCAqLworcGEyICA9IC0zLjcyMjA3ODc2MDM1NzAxMzIzODQ3ZS0wMSwgLyogMHhCRkQ3RDI0MCwgMHhGQkI4QzNGMSAqLworcGEzICA9ICAzLjE4MzQ2NjE5OTAxMTYxNzUzNjc0ZS0wMSwgLyogMHgzRkQ0NUZDQSwgMHg4MDUxMjBFNCAqLworcGE0ICA9IC0xLjEwODk0Njk0MjgyMzk2Njc3NDc2ZS0wMSwgLyogMHhCRkJDNjM5OCwgMHgzRDNFMjhFQyAqLworcGE1ICA9ICAzLjU0NzgzMDQzMjU2MTgyMzU5MzcxZS0wMiwgLyogMHgzRkEyMkEzNiwgMHg1OTk3OTVFQiAqLworcGE2ICA9IC0yLjE2NjM3NTU5NDg2ODc5MDg0MzAwZS0wMywgLyogMHhCRjYxQkYzOCwgMHgwQTk2MDczRiAqLworcWExICA9ICAxLjA2NDIwODgwNDAwODQ0MjI4Mjg2ZS0wMSwgLyogMHgzRkJCM0U2NiwgMHgxOEVFRTMyMyAqLworcWEyICA9ICA1LjQwMzk3OTE3NzAyMTcxMDQ4OTM3ZS0wMSwgLyogMHgzRkUxNEFGMCwgMHg5MkVCNkYzMyAqLworcWEzICA9ICA3LjE4Mjg2NTQ0MTQxOTYyNjYyODY4ZS0wMiwgLyogMHgzRkIyNjM1QywgMHhEOTlGRTlBNyAqLworcWE0ICA9ICAxLjI2MTcxMjE5ODA4NzYxNjQyMTEyZS0wMSwgLyogMHgzRkMwMjY2MCwgMHhFNzYzMzUxRiAqLworcWE1ICA9ICAxLjM2MzcwODM5MTIwMjkwNTA3MzYyZS0wMiwgLyogMHgzRjhCRURDMiwgMHg2QjUxREQxQyAqLworcWE2ICA9ICAxLjE5ODQ0OTk4NDY3OTkxMDc0MTcwZS0wMiwgLyogMHgzRjg4OEI1NCwgMHg1NzM1MTUxRCAqLworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgYXBwcm94aW1hdGlvbiB0byAgZXJmYyBpbiBbMS4yNSwxLzAuMzVdCisgKi8KK3JhMCAgPSAtOS44NjQ5NDQwMzQ4NDcxNDgyMjcwNWUtMDMsIC8qIDB4QkY4NDM0MTIsIDB4NjAwRDY0MzUgKi8KK3JhMSAgPSAtNi45Mzg1ODU3MjcwNzE4MTc2NDM3MmUtMDEsIC8qIDB4QkZFNjM0MTYsIDB4RTRCQTczNjAgKi8KK3JhMiAgPSAtMS4wNTU4NjI2MjI1MzIzMjkwOTgxNGUrMDEsIC8qIDB4QzAyNTFFMDQsIDB4NDFCMEU3MjYgKi8KK3JhMyAgPSAtNi4yMzc1MzMyNDUwMzI2MDA2MDM5NmUrMDEsIC8qIDB4QzA0RjMwMEEsIDB4RTRDQkEzOEQgKi8KK3JhNCAgPSAtMS42MjM5NjY2OTQ2MjU3MzQ3MDM1NWUrMDIsIC8qIDB4QzA2NDRDQjEsIDB4ODQyODIyNjYgKi8KK3JhNSAgPSAtMS44NDYwNTA5MjkwNjcxMTAzNTk5NGUrMDIsIC8qIDB4QzA2NzEzNUMsIDB4RUJDQ0FCQjIgKi8KK3JhNiAgPSAtOC4xMjg3NDM1NTA2MzA2NTkzNDI0NmUrMDEsIC8qIDB4QzA1NDUyNjUsIDB4NTdFNEQyRjIgKi8KK3JhNyAgPSAtOS44MTQzMjkzNDQxNjkxNDU0ODU5MmUrMDAsIC8qIDB4QzAyM0EwRUYsIDB4QzY5QUMyNUMgKi8KK3NhMSAgPSAgMS45NjUxMjcxNjY3NDM5MjU3MTI5MmUrMDEsIC8qIDB4NDAzM0E2QjksIDB4QkQ3MDc2ODcgKi8KK3NhMiAgPSAgMS4zNzY1Nzc1NDE0MzUxOTA0MjYwMGUrMDIsIC8qIDB4NDA2MTM1MEMsIDB4NTI2QUU3MjEgKi8KK3NhMyAgPSAgNC4zNDU2NTg3NzQ3NTIyOTIyODgyMWUrMDIsIC8qIDB4NDA3QjI5MEQsIDB4RDU4QTFBNzEgKi8KK3NhNCAgPSAgNi40NTM4NzI3MTczMzI2Nzg4MDMzNmUrMDIsIC8qIDB4NDA4NDJCMTksIDB4MjFFQzI4NjggKi8KK3NhNSAgPSAgNC4yOTAwODE0MDAyNzU2NzgzMzM4NmUrMDIsIC8qIDB4NDA3QUQwMjEsIDB4NTc3MDAzMTQgKi8KK3NhNiAgPSAgMS4wODYzNTAwNTU0MTc3OTQzNTEzNGUrMDIsIC8qIDB4NDA1QjI4QTMsIDB4RUU0OEFFMkMgKi8KK3NhNyAgPSAgNi41NzAyNDk3NzAzMTkyODE3MDEzNWUrMDAsIC8qIDB4NDAxQTQ3RUYsIDB4OEU0ODRBOTMgKi8KK3NhOCAgPSAtNi4wNDI0NDE1MjE0ODU4MDk4NzQzOGUtMDIsIC8qIDB4QkZBRUVGRjIsIDB4RUU3NDlBNjIgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZmMgaW4gWzEvLjM1LDI4XQorICovCityYjAgID0gLTkuODY0OTQyOTI0NzAwMDk5Mjg1OTdlLTAzLCAvKiAweEJGODQzNDEyLCAweDM5RTg2RjRBICovCityYjEgID0gLTcuOTkyODMyMzc2ODA1MjMwMDY1NzRlLTAxLCAvKiAweEJGRTk5M0JBLCAweDcwQzI4NURFICovCityYjIgID0gLTEuNzc1Nzk1NDkxNzc1NDc1MTk4ODllKzAxLCAvKiAweEMwMzFDMjA5LCAweDU1NUY5OTVBICovCityYjMgID0gLTEuNjA2MzYzODQ4NTU4MjE5MTYwNjJlKzAyLCAvKiAweEMwNjQxNDVELCAweDQzQzVFRDk4ICovCityYjQgID0gLTYuMzc1NjY0NDMzNjgzODk2Mjc3MjJlKzAyLCAvKiAweEMwODNFQzg4LCAweDEzNzVGMjI4ICovCityYjUgID0gLTEuMDI1MDk1MTMxNjExMDc3MjQ5NTRlKzAzLCAvKiAweEMwOTAwNDYxLCAweDZBMkU1OTkyICovCityYjYgID0gLTQuODM1MTkxOTE2MDg2NTEzOTcwMTllKzAyLCAvKiAweEMwN0UzODRFLCAweDlCREMzODNGICovCitzYjEgID0gIDMuMDMzODA2MDc0MzQ4MjQ1ODI5MjRlKzAxLCAvKiAweDQwM0U1NjhCLCAweDI2MUQ1MTkwICovCitzYjIgID0gIDMuMjU3OTI1MTI5OTY1NzM5MTg4MjZlKzAyLCAvKiAweDQwNzQ1Q0FFLCAweDIyMUI5RjBBICovCitzYjMgID0gIDEuNTM2NzI5NTg2MDg0NDM2OTU5OTRlKzAzLCAvKiAweDQwOTgwMkVCLCAweDE4OUQ1MTE4ICovCitzYjQgID0gIDMuMTk5ODU4MjE5NTA4NTk1NTM5MDhlKzAzLCAvKiAweDQwQThGRkI3LCAweDY4OEMyNDZBICovCitzYjUgID0gIDIuNTUzMDUwNDA2NDMzMTY0NDI1ODNlKzAzLCAvKiAweDQwQTNGMjE5LCAweENFREYzQkU2ICovCitzYjYgID0gIDQuNzQ1Mjg1NDEyMDY5NTUzNjcyMTVlKzAyLCAvKiAweDQwN0RBODc0LCAweEU3OUZFNzYzICovCitzYjcgID0gLTIuMjQ0MDk1MjQ0NjU4NTgxODMzNjJlKzAxOyAvKiAweEMwMzY3MEUyLCAweDQyNzEyRDYyICovCisKK2RvdWJsZQorZXJmKGRvdWJsZSB4KQoreworCWludDMyX3QgaHgsaXgsaTsKKwlkb3VibGUgUixTLFAsUSxzLHkseixyOworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmZjAwMDAwKSB7CQkvKiBlcmYobmFuKT1uYW4gKi8KKwkgICAgaSA9ICgodV9pbnQzMl90KWh4Pj4zMSk8PDE7CisJICAgIHJldHVybiAoZG91YmxlKSgxLWkpK29uZS94OwkvKiBlcmYoKy1pbmYpPSstMSAqLworCX0KKworCWlmKGl4IDwgMHgzZmViMDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDNlMzAwMDAwKSB7IAkvKiB8eHw8MioqLTI4ICovCisJICAgICAgICBpZiAoaXggPCAweDAwODAwMDAwKQorCQkgICAgcmV0dXJuIDAuMTI1Kig4LjAqeCtlZng4KngpOyAgLyphdm9pZCB1bmRlcmZsb3cgKi8KKwkJcmV0dXJuIHggKyBlZngqeDsKKwkgICAgfQorCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIHJldHVybiB4ICsgeCp5OworCX0KKwlpZihpeCA8IDB4M2ZmNDAwMDApIHsJCS8qIDAuODQzNzUgPD0gfHh8IDwgMS4yNSAqLworCSAgICBzID0gZmFicyh4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHJldHVybiBlcnggKyBQL1E7IGVsc2UgcmV0dXJuIC1lcnggLSBQL1E7CisJfQorCWlmIChpeCA+PSAweDQwMTgwMDAwKSB7CQkvKiBpbmY+fHh8Pj02ICovCisJICAgIGlmKGh4Pj0wKSByZXR1cm4gb25lLXRpbnk7IGVsc2UgcmV0dXJuIHRpbnktb25lOworCX0KKwl4ID0gZmFicyh4KTsKKyAJcyA9IG9uZS8oeCp4KTsKKwlpZihpeDwgMHg0MDA2REI2RSkgewkvKiB8eHwgPCAxLzAuMzUgKi8KKwkgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJfSBlbHNlIHsJLyogfHh8ID49IDEvMC4zNSAqLworCSAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCX0KKwl6ICA9IHg7CisJU0VUX0xPV19XT1JEKHosMCk7CisJciAgPSAgX19pZWVlNzU0X2V4cCgteip6LTAuNTYyNSkqX19pZWVlNzU0X2V4cCgoei14KSooeit4KStSL1MpOworCWlmKGh4Pj0wKSByZXR1cm4gb25lLXIveDsgZWxzZSByZXR1cm4gIHIveC1vbmU7Cit9CisKK2RvdWJsZQorZXJmYyhkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4LGl4OworCWRvdWJsZSBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHsJCQkvKiBlcmZjKG5hbik9bmFuICovCisJCQkJCQkvKiBlcmZjKCstaW5mKT0wLDIgKi8KKwkgICAgcmV0dXJuIChkb3VibGUpKCgodV9pbnQzMl90KWh4Pj4zMSk8PDEpK29uZS94OworCX0KKworCWlmKGl4IDwgMHgzZmViMDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDNjNzAwMDAwKSAgCS8qIHx4fDwyKiotNTYgKi8KKwkJcmV0dXJuIG9uZS14OworCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIGlmKGh4IDwgMHgzZmQwMDAwMCkgeyAgCS8qIHg8MS80ICovCisJCXJldHVybiBvbmUtKHgreCp5KTsKKwkgICAgfSBlbHNlIHsKKwkJciA9IHgqeTsKKwkJciArPSAoeC1oYWxmKTsKKwkgICAgICAgIHJldHVybiBoYWxmIC0gciA7CisJICAgIH0KKwl9CisJaWYoaXggPCAweDNmZjQwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnMoeCktb25lOworCSAgICBQID0gcGEwK3MqKHBhMStzKihwYTIrcyoocGEzK3MqKHBhNCtzKihwYTUrcypwYTYpKSkpKTsKKwkgICAgUSA9IG9uZStzKihxYTErcyoocWEyK3MqKHFhMytzKihxYTQrcyoocWE1K3MqcWE2KSkpKSk7CisJICAgIGlmKGh4Pj0wKSB7CisJICAgICAgICB6ICA9IG9uZS1lcng7IHJldHVybiB6IC0gUC9ROworCSAgICB9IGVsc2UgeworCQl6ID0gZXJ4K1AvUTsgcmV0dXJuIG9uZSt6OworCSAgICB9CisJfQorCWlmIChpeCA8IDB4NDAzYzAwMDApIHsJCS8qIHx4fDwyOCAqLworCSAgICB4ID0gZmFicyh4KTsKKyAJICAgIHMgPSBvbmUvKHgqeCk7CisJICAgIGlmKGl4PCAweDQwMDZEQjZEKSB7CS8qIHx4fCA8IDEvLjM1IH4gMi44NTcxNDMqLworCSAgICAgICAgUj1yYTArcyoocmExK3MqKHJhMitzKihyYTMrcyoocmE0K3MqKAorCQkJCXJhNStzKihyYTYrcypyYTcpKSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCSAgICB9IGVsc2UgewkJCS8qIHx4fCA+PSAxLy4zNSB+IDIuODU3MTQzICovCisJCWlmKGh4PDAmJml4Pj0weDQwMTgwMDAwKSByZXR1cm4gdHdvLXRpbnk7LyogeCA8IC02ICovCisJICAgICAgICBSPXJiMCtzKihyYjErcyoocmIyK3MqKHJiMytzKihyYjQrcyooCisJCQkJcmI1K3MqcmI2KSkpKSk7CisJICAgICAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwkgICAgfQorCSAgICB6ICA9IHg7CisJICAgIFNFVF9MT1dfV09SRCh6LDApOworCSAgICByICA9ICBfX2llZWU3NTRfZXhwKC16KnotMC41NjI1KSoKKwkJCV9faWVlZTc1NF9leHAoKHoteCkqKHoreCkrUi9TKTsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHIveDsgZWxzZSByZXR1cm4gdHdvLXIveDsKKwl9IGVsc2UgeworCSAgICBpZihoeD4wKSByZXR1cm4gdGlueSp0aW55OyBlbHNlIHJldHVybiB0d28tdGlueTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2VyZmYuYyBiL2xpYm0vc3JjL3NfZXJmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTA1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2VyZmYuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogc19lcmZmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2VyZi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19lcmZmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordGlueQkgICAgPSAxZS0zMCwKK2hhbGY9ICA1LjAwMDAwMDAwMDBlLTAxLCAvKiAweDNGMDAwMDAwICovCitvbmUgPSAgMS4wMDAwMDAwMDAwZSswMCwgLyogMHgzRjgwMDAwMCAqLwordHdvID0gIDIuMDAwMDAwMDAwMGUrMDAsIC8qIDB4NDAwMDAwMDAgKi8KKwkvKiBjID0gKHN1YmZsb2F0KTAuODQ1MDYyOTExNTEgKi8KK2VyeCA9ICA4LjQ1MDYyOTExNTFlLTAxLCAvKiAweDNmNTg1NjBiICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmYgb24gWzAsMC44NDM3NV0KKyAqLworZWZ4ID0gIDEuMjgzNzkxNjYxM2UtMDEsIC8qIDB4M2UwMzc1ZDQgKi8KK2VmeDg9ICAxLjAyNzAzMzMyOTBlKzAwLCAvKiAweDNmODM3NWQ0ICovCitwcDAgID0gIDEuMjgzNzkxNjYxM2UtMDEsIC8qIDB4M2UwMzc1ZDQgKi8KK3BwMSAgPSAtMy4yNTA0MjA5ODc2ZS0wMSwgLyogMHhiZWE2NmJlYiAqLworcHAyICA9IC0yLjg0ODE3NDk4MThlLTAyLCAvKiAweGJjZTk1MjhmICovCitwcDMgID0gLTUuNzcwMjcwMjQ3MGUtMDMsIC8qIDB4YmJiZDE0ODkgKi8KK3BwNCAgPSAtMi4zNzYzMDE3NDUyZS0wNSwgLyogMHhiN2M3NTZiMSAqLworcXExICA9ICAzLjk3OTE3MjExMDZlLTAxLCAvKiAweDNlY2JiYmNlICovCitxcTIgID0gIDYuNTAyMjI1MjUwMGUtMDIsIC8qIDB4M2Q4NTJhNjMgKi8KK3FxMyAgPSAgNS4wODEzMDYyMTE3ZS0wMywgLyogMHgzYmE2ODExNiAqLworcXE0ICA9ICAxLjMyNDk0NzM3MDRlLTA0LCAvKiAweDM5MGFlZTQ5ICovCitxcTUgID0gLTMuOTYwMjI4MjQxM2UtMDYsIC8qIDB4YjY4NGUyMWEgKi8KKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpb24gdG8gIGVyZiAgaW4gWzAuODQzNzUsMS4yNV0KKyAqLworcGEwICA9IC0yLjM2MjExODU2ODNlLTAzLCAvKiAweGJiMWFjZGM2ICovCitwYTEgID0gIDQuMTQ4NTYxMDYwNGUtMDEsIC8qIDB4M2VkNDY4MDUgKi8KK3BhMiAgPSAtMy43MjIwNzg4MDAyZS0wMSwgLyogMHhiZWJlOTIwOCAqLworcGEzICA9ICAzLjE4MzQ2NjE5NjFlLTAxLCAvKiAweDNlYTJmZTU0ICovCitwYTQgID0gLTEuMTA4OTQ2OTQ5MmUtMDEsIC8qIDB4YmRlMzFjYzIgKi8KK3BhNSAgPSAgMy41NDc4MzA1MDcyZS0wMiwgLyogMHgzZDExNTFiMyAqLworcGE2ICA9IC0yLjE2NjM3NTUxNzhlLTAzLCAvKiAweGJiMGRmOWMwICovCitxYTEgID0gIDEuMDY0MjA4ODIwNWUtMDEsIC8qIDB4M2RkOWYzMzEgKi8KK3FhMiAgPSAgNS40MDM5Nzk0MjA3ZS0wMSwgLyogMHgzZjBhNTc4NSAqLworcWEzICA9ICA3LjE4Mjg2NTU4OTllLTAyLCAvKiAweDNkOTMxYWU3ICovCitxYTQgID0gIDEuMjYxNzEyMTYzN2UtMDEsIC8qIDB4M2UwMTMzMDcgKi8KK3FhNSAgPSAgMS4zNjM3MDgzNTgzZS0wMiwgLyogMHgzYzVmNmUxMyAqLworcWE2ICA9ICAxLjE5ODQ1MDAxMDNlLTAyLCAvKiAweDNjNDQ1YWEzICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLjI1LDEvMC4zNV0KKyAqLworcmEwICA9IC05Ljg2NDk0NDAzMzNlLTAzLCAvKiAweGJjMjFhMDkzICovCityYTEgID0gLTYuOTM4NTg1NjM5MGUtMDEsIC8qIDB4YmYzMWEwYjcgKi8KK3JhMiAgPSAtMS4wNTU4NjI2MTc1ZSswMSwgLyogMHhjMTI4ZjAyMiAqLworcmEzICA9IC02LjIzNzUzMzE4NzllKzAxLCAvKiAweGMyNzk4MDU3ICovCityYTQgID0gLTEuNjIzOTY2Njc0OGUrMDIsIC8qIDB4YzMyMjY1OGMgKi8KK3JhNSAgPSAtMS44NDYwNTA4NzI4ZSswMiwgLyogMHhjMzM4OWFlNyAqLworcmE2ICA9IC04LjEyODc0Mzc0MzllKzAxLCAvKiAweGMyYTI5MzJiICovCityYTcgID0gLTkuODE0MzI5MTQ3M2UrMDAsIC8qIDB4YzExZDA3N2UgKi8KK3NhMSAgPSAgMS45NjUxMjcxODIwZSswMSwgLyogMHg0MTlkMzVjZSAqLworc2EyICA9ICAxLjM3NjU3NzYwNjJlKzAyLCAvKiAweDQzMDlhODYzICovCitzYTMgID0gIDQuMzQ1NjU4ODc0NWUrMDIsIC8qIDB4NDNkOTQ4NmYgKi8KK3NhNCAgPSAgNi40NTM4NzI2ODA3ZSswMiwgLyogMHg0NDIxNThjOSAqLworc2E1ICA9ICA0LjI5MDA4MTQ4MTllKzAyLCAvKiAweDQzZDY4MTBiICovCitzYTYgID0gIDEuMDg2MzUwMDIxNGUrMDIsIC8qIDB4NDJkOTQ1MWYgKi8KK3NhNyAgPSAgNi41NzAyNDk1NTc1ZSswMCwgLyogMHg0MGQyM2Y3YyAqLworc2E4ICA9IC02LjA0MjQ0MTM1MzJlLTAyLCAvKiAweGJkNzc3Zjk3ICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBhcHByb3hpbWF0aW9uIHRvICBlcmZjIGluIFsxLy4zNSwyOF0KKyAqLworcmIwICA9IC05Ljg2NDk0MzEwMjBlLTAzLCAvKiAweGJjMjFhMDkyICovCityYjEgID0gLTcuOTkyODMyNjYwN2UtMDEsIC8qIDB4YmY0YzlkZDQgKi8KK3JiMiAgPSAtMS43NzU3OTU1NTUxZSswMSwgLyogMHhjMThlMTA0YiAqLworcmIzICA9IC0xLjYwNjM2MzgzMDZlKzAyLCAvKiAweGMzMjBhMmVhICovCityYjQgID0gLTYuMzc1NjY0NjcyOWUrMDIsIC8qIDB4YzQxZjY0NDEgKi8KK3JiNSAgPSAtMS4wMjUwOTUwOTI4ZSswMywgLyogMHhjNDgwMjMwYiAqLworcmI2ICA9IC00LjgzNTE5MTk1NTZlKzAyLCAvKiAweGMzZjFjMjc1ICovCitzYjEgID0gIDMuMDMzODA2MDM3OWUrMDEsIC8qIDB4NDFmMmI0NTkgKi8KK3NiMiAgPSAgMy4yNTc5MjUxMDk5ZSswMiwgLyogMHg0M2EyZTU3MSAqLworc2IzICA9ICAxLjUzNjcyOTYxNDNlKzAzLCAvKiAweDQ0YzAxNzU5ICovCitzYjQgID0gIDMuMTk5ODU4MTU0M2UrMDMsIC8qIDB4NDU0N2ZkYmIgKi8KK3NiNSAgPSAgMi41NTMwNTAyOTMwZSswMywgLyogMHg0NTFmOTBjZSAqLworc2I2ICA9ICA0Ljc0NTI4NTMzOTRlKzAyLCAvKiAweDQzZWQ0M2E3ICovCitzYjcgID0gLTIuMjQ0MDk1MjMwMWUrMDE7IC8qIDB4YzFiMzg3MTIgKi8KKworZmxvYXQKK2VyZmYoZmxvYXQgeCkKK3sKKwlpbnQzMl90IGh4LGl4LGk7CisJZmxvYXQgUixTLFAsUSxzLHkseixyOworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHgmMHg3ZmZmZmZmZjsKKwlpZihpeD49MHg3ZjgwMDAwMCkgewkJLyogZXJmKG5hbik9bmFuICovCisJICAgIGkgPSAoKHVfaW50MzJfdCloeD4+MzEpPDwxOworCSAgICByZXR1cm4gKGZsb2F0KSgxLWkpK29uZS94OwkvKiBlcmYoKy1pbmYpPSstMSAqLworCX0KKworCWlmKGl4IDwgMHgzZjU4MDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDMxODAwMDAwKSB7IAkvKiB8eHw8MioqLTI4ICovCisJICAgICAgICBpZiAoaXggPCAweDA0MDAwMDAwKQorCQkgICAgLyphdm9pZCB1bmRlcmZsb3cgKi8KKwkJICAgIHJldHVybiAoZmxvYXQpMC4xMjUqKChmbG9hdCk4LjAqeCtlZng4KngpOworCQlyZXR1cm4geCArIGVmeCp4OworCSAgICB9CisJICAgIHogPSB4Kng7CisJICAgIHIgPSBwcDAreioocHAxK3oqKHBwMit6KihwcDMreipwcDQpKSk7CisJICAgIHMgPSBvbmUreioocXExK3oqKHFxMit6KihxcTMreioocXE0K3oqcXE1KSkpKTsKKwkgICAgeSA9IHIvczsKKwkgICAgcmV0dXJuIHggKyB4Knk7CisJfQorCWlmKGl4IDwgMHgzZmEwMDAwMCkgewkJLyogMC44NDM3NSA8PSB8eHwgPCAxLjI1ICovCisJICAgIHMgPSBmYWJzZih4KS1vbmU7CisJICAgIFAgPSBwYTArcyoocGExK3MqKHBhMitzKihwYTMrcyoocGE0K3MqKHBhNStzKnBhNikpKSkpOworCSAgICBRID0gb25lK3MqKHFhMStzKihxYTIrcyoocWEzK3MqKHFhNCtzKihxYTUrcypxYTYpKSkpKTsKKwkgICAgaWYoaHg+PTApIHJldHVybiBlcnggKyBQL1E7IGVsc2UgcmV0dXJuIC1lcnggLSBQL1E7CisJfQorCWlmIChpeCA+PSAweDQwYzAwMDAwKSB7CQkvKiBpbmY+fHh8Pj02ICovCisJICAgIGlmKGh4Pj0wKSByZXR1cm4gb25lLXRpbnk7IGVsc2UgcmV0dXJuIHRpbnktb25lOworCX0KKwl4ID0gZmFic2YoeCk7CisgCXMgPSBvbmUvKHgqeCk7CisJaWYoaXg8IDB4NDAzNkRCNkUpIHsJLyogfHh8IDwgMS8wLjM1ICovCisJICAgIFI9cmEwK3MqKHJhMStzKihyYTIrcyoocmEzK3MqKHJhNCtzKigKKwkJCQlyYTUrcyoocmE2K3MqcmE3KSkpKSkpOworCSAgICBTPW9uZStzKihzYTErcyooc2EyK3MqKHNhMytzKihzYTQrcyooCisJCQkJc2E1K3MqKHNhNitzKihzYTcrcypzYTgpKSkpKSkpOworCX0gZWxzZSB7CS8qIHx4fCA+PSAxLzAuMzUgKi8KKwkgICAgUj1yYjArcyoocmIxK3MqKHJiMitzKihyYjMrcyoocmI0K3MqKAorCQkJCXJiNStzKnJiNikpKSkpOworCSAgICBTPW9uZStzKihzYjErcyooc2IyK3MqKHNiMytzKihzYjQrcyooCisJCQkJc2I1K3MqKHNiNitzKnNiNykpKSkpKTsKKwl9CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJU0VUX0ZMT0FUX1dPUkQoeixpeCYweGZmZmZmMDAwKTsKKwlyICA9ICBfX2llZWU3NTRfZXhwZigteip6LShmbG9hdCkwLjU2MjUpKl9faWVlZTc1NF9leHBmKCh6LXgpKih6K3gpK1IvUyk7CisJaWYoaHg+PTApIHJldHVybiBvbmUtci94OyBlbHNlIHJldHVybiAgci94LW9uZTsKK30KKworZmxvYXQKK2VyZmNmKGZsb2F0IHgpCit7CisJaW50MzJfdCBoeCxpeDsKKwlmbG9hdCBSLFMsUCxRLHMseSx6LHI7CisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOworCWlmKGl4Pj0weDdmODAwMDAwKSB7CQkJLyogZXJmYyhuYW4pPW5hbiAqLworCQkJCQkJLyogZXJmYygrLWluZik9MCwyICovCisJICAgIHJldHVybiAoZmxvYXQpKCgodV9pbnQzMl90KWh4Pj4zMSk8PDEpK29uZS94OworCX0KKworCWlmKGl4IDwgMHgzZjU4MDAwMCkgewkJLyogfHh8PDAuODQzNzUgKi8KKwkgICAgaWYoaXggPCAweDIzODAwMDAwKSAgCS8qIHx4fDwyKiotNTYgKi8KKwkJcmV0dXJuIG9uZS14OworCSAgICB6ID0geCp4OworCSAgICByID0gcHAwK3oqKHBwMSt6KihwcDIreioocHAzK3oqcHA0KSkpOworCSAgICBzID0gb25lK3oqKHFxMSt6KihxcTIreioocXEzK3oqKHFxNCt6KnFxNSkpKSk7CisJICAgIHkgPSByL3M7CisJICAgIGlmKGh4IDwgMHgzZTgwMDAwMCkgeyAgCS8qIHg8MS80ICovCisJCXJldHVybiBvbmUtKHgreCp5KTsKKwkgICAgfSBlbHNlIHsKKwkJciA9IHgqeTsKKwkJciArPSAoeC1oYWxmKTsKKwkgICAgICAgIHJldHVybiBoYWxmIC0gciA7CisJICAgIH0KKwl9CisJaWYoaXggPCAweDNmYTAwMDAwKSB7CQkvKiAwLjg0Mzc1IDw9IHx4fCA8IDEuMjUgKi8KKwkgICAgcyA9IGZhYnNmKHgpLW9uZTsKKwkgICAgUCA9IHBhMCtzKihwYTErcyoocGEyK3MqKHBhMytzKihwYTQrcyoocGE1K3MqcGE2KSkpKSk7CisJICAgIFEgPSBvbmUrcyoocWExK3MqKHFhMitzKihxYTMrcyoocWE0K3MqKHFhNStzKnFhNikpKSkpOworCSAgICBpZihoeD49MCkgeworCSAgICAgICAgeiAgPSBvbmUtZXJ4OyByZXR1cm4geiAtIFAvUTsKKwkgICAgfSBlbHNlIHsKKwkJeiA9IGVyeCtQL1E7IHJldHVybiBvbmUrejsKKwkgICAgfQorCX0KKwlpZiAoaXggPCAweDQxZTAwMDAwKSB7CQkvKiB8eHw8MjggKi8KKwkgICAgeCA9IGZhYnNmKHgpOworIAkgICAgcyA9IG9uZS8oeCp4KTsKKwkgICAgaWYoaXg8IDB4NDAzNkRCNkQpIHsJLyogfHh8IDwgMS8uMzUgfiAyLjg1NzE0MyovCisJICAgICAgICBSPXJhMCtzKihyYTErcyoocmEyK3MqKHJhMytzKihyYTQrcyooCisJCQkJcmE1K3MqKHJhNitzKnJhNykpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNhMStzKihzYTIrcyooc2EzK3MqKHNhNCtzKigKKwkJCQlzYTUrcyooc2E2K3MqKHNhNytzKnNhOCkpKSkpKSk7CisJICAgIH0gZWxzZSB7CQkJLyogfHh8ID49IDEvLjM1IH4gMi44NTcxNDMgKi8KKwkJaWYoaHg8MCYmaXg+PTB4NDBjMDAwMDApIHJldHVybiB0d28tdGlueTsvKiB4IDwgLTYgKi8KKwkgICAgICAgIFI9cmIwK3MqKHJiMStzKihyYjIrcyoocmIzK3MqKHJiNCtzKigKKwkJCQlyYjUrcypyYjYpKSkpKTsKKwkgICAgICAgIFM9b25lK3MqKHNiMStzKihzYjIrcyooc2IzK3MqKHNiNCtzKigKKwkJCQlzYjUrcyooc2I2K3Mqc2I3KSkpKSkpOworCSAgICB9CisJICAgIEdFVF9GTE9BVF9XT1JEKGl4LHgpOworCSAgICBTRVRfRkxPQVRfV09SRCh6LGl4JjB4ZmZmZmYwMDApOworCSAgICByICA9ICBfX2llZWU3NTRfZXhwZigteip6LShmbG9hdCkwLjU2MjUpKgorCQkJX19pZWVlNzU0X2V4cGYoKHoteCkqKHoreCkrUi9TKTsKKwkgICAgaWYoaHg+MCkgcmV0dXJuIHIveDsgZWxzZSByZXR1cm4gdHdvLXIveDsKKwl9IGVsc2UgeworCSAgICBpZihoeD4wKSByZXR1cm4gdGlueSp0aW55OyBlbHNlIHJldHVybiB0d28tdGlueTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cDIuYyBiL2xpYm0vc3JjL3NfZXhwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGVmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cDIuYwpAQCAtMCwwICsxLDM4OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19leHAyLmMsdiAxLjEgMjAwNS8wNC8wNSAwMjo1NzoxNSBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2RlZmluZQlUQkxCSVRTCTgKKyNkZWZpbmUJVEJMU0laRQkoMSA8PCBUQkxCSVRTKQorCitzdGF0aWMgY29uc3QgZG91YmxlCisgICAgaHVnZSAgICAgPSAweDFwMTAwMCwKKyAgICB0d29tMTAwMCA9IDB4MXAtMTAwMCwKKyAgICByZWR1eCAgICA9IDB4MS44cDUyIC8gVEJMU0laRSwKKyAgICBQMQkgICAgID0gMHgxLjYyZTQyZmVmYTM5ZWZwLTEsCisgICAgUDIJICAgICA9IDB4MS5lYmZiZGZmODJjNTc1cC0zLAorICAgIFAzCSAgICAgPSAweDEuYzZiMDhkNzA0YTBhNnAtNSwKKyAgICBQNAkgICAgID0gMHgxLjNiMmFiODhmNzA0MDBwLTcsCisgICAgUDUJICAgICA9IDB4MS41ZDg4MDAzODc1Yzc0cC0xMDsKKworc3RhdGljIGNvbnN0IGRvdWJsZSB0YmxbVEJMU0laRSAqIDJdID0geworLyoJZXhwMih6ICsgZXBzKQkJZXBzCSovCisJMHgxLjZhMDllNjY3ZjNkNWRwLTEsCSAweDEuOTg4MHAtNDQsCisJMHgxLjZiMDUyZmE3NTE3NDRwLTEsCSAweDEuODAwMHAtNTAsCisJMHgxLjZjMDEyNzUwYmQ5ZmVwLTEsCS0weDEuODc4MHAtNDUsCisJMHgxLjZjZmRjZGRkNDc2YmZwLTEsCSAweDEuZWMwMHAtNDYsCisJMHgxLjZkZmIyM2M2NTFhMjlwLTEsCS0weDEuODAwMHAtNTAsCisJMHgxLjZlZjkyOTg1OTNhZTNwLTEsCS0weDEuYzAwMHAtNTIsCisJMHgxLjZmZjdkZjk1MTkzODZwLTEsCS0weDEuZmQ4MHAtNDUsCisJMHgxLjcwZjc0NjZmNDJkYTNwLTEsCS0weDEuYzg4MHAtNDUsCisJMHgxLjcxZjc1ZThlYzVmYzNwLTEsCSAweDEuM2MwMHAtNDYsCisJMHgxLjcyZjgyODZlYWNmMDVwLTEsCS0weDEuODMwMHAtNDQsCisJMHgxLjczZjlhNDhhNTgxNTJwLTEsCS0weDEuMGMwMHAtNDcsCisJMHgxLjc0ZmJkMzVkN2NjZmNwLTEsCSAweDEuZjg4MHAtNDUsCisJMHgxLjc1ZmViNTY0MjY3ZjFwLTEsCSAweDEuM2UwMHAtNDcsCisJMHgxLjc3MDI0YjFhYjZkNDhwLTEsCS0weDEuN2QwMHAtNDUsCisJMHgxLjc4MDY5NGZkZTVkMzhwLTEsCS0weDEuZDAwMHAtNTAsCisJMHgxLjc5MGI5MzhhYzFkMDBwLTEsCSAweDEuMzAwMHAtNDksCisJMHgxLjdhMTE0NzNlYjAxNzhwLTEsCS0weDEuZDAwMHAtNDksCisJMHgxLjdiMTdiMDk3NmQwNjBwLTEsCSAweDEuMDQwMHAtNDUsCisJMHgxLjdjMWVkMDEzMGMxMzNwLTEsCSAweDEuMDAwMHAtNTMsCisJMHgxLjdkMjZhNjJmZjg2MzZwLTEsCS0weDEuNjkwMHAtNDUsCisJMHgxLjdlMmYzMzZjZjRlM2JwLTEsCS0weDEuMmUwMHAtNDcsCisJMHgxLjdmMzg3ODQ5MWMzZThwLTEsCS0weDEuNDU4MHAtNDUsCisJMHgxLjgwNDI3NTQzZTFiNGVwLTEsCSAweDEuMzAwMHAtNDQsCisJMHgxLjgxNGQyYWRkMTA3MWFwLTEsCSAweDEuZjAwMHAtNDcsCisJMHgxLjgyNTg5OTk0Y2NkN2VwLTEsCS0weDEuMWMwMHAtNDUsCisJMHgxLjgzNjRjMWViOTQyZDBwLTEsCSAweDEuOWQwMHAtNDUsCisJMHgxLjg0NzFhNDYyM2NhYjVwLTEsCSAweDEuNzEwMHAtNDMsCisJMHgxLjg1N2Y0MTc5ZjViYmNwLTEsCSAweDEuMjYwMHAtNDUsCisJMHgxLjg2OGQ5OWI0NDkxYWZwLTEsCS0weDEuMmM0MHAtNDQsCisJMHgxLjg3OWNhZDkzMWEzOTVwLTEsCS0weDEuMzAwMHAtNDUsCisJMHgxLjg4YWM3ZDk4YTY1YjhwLTEsCS0weDEuYTgwMHAtNDUsCisJMHgxLjg5YmQwYTQ3ODU4MDBwLTEsCS0weDEuZDAwMHAtNDksCisJMHgxLjhhY2U1NDIyYWEyMjNwLTEsCSAweDEuMzI4MHAtNDQsCisJMHgxLjhiZTA1YmFkNjE5ZmFwLTEsCSAweDEuMmI0MHAtNDMsCisJMHgxLjhjZjMyMTZiNTQzODNwLTEsCS0weDEuZWQwMHAtNDUsCisJMHgxLjhlMDZhNWUwODY2NGNwLTEsCS0weDEuMDUwMHAtNDUsCisJMHgxLjhmMWFlOTkxNTc4MDdwLTEsCSAweDEuODI4MHAtNDUsCisJMHgxLjkwMmZlZDAyODJjMGVwLTEsCS0weDEuY2IwMHAtNDYsCisJMHgxLjkxNDViMGI5MWZmOTZwLTEsCS0weDEuNWUwMHAtNDcsCisJMHgxLjkyNWMzNTNhYTJmZjlwLTEsCSAweDEuNTQwMHAtNDgsCisJMHgxLjkzNzM3YjBjZGM2NGFwLTEsCSAweDEuNzIwMHAtNDYsCisJMHgxLjk0OGI4MmI1Zjk4YWVwLTEsCS0weDEuOTAwMHAtNDcsCisJMHgxLjk1YTQ0Y2JjODUyY2JwLTEsCSAweDEuNTY4MHAtNDUsCisJMHgxLjk2YmRkOWE3NjZmMjFwLTEsCS0weDEuNmQwMHAtNDQsCisJMHgxLjk3ZDgyOWZkZTRlMmFwLTEsCS0weDEuMTAwMHAtNDcsCisJMHgxLjk4ZjMzZTQ3YTIzYTNwLTEsCSAweDEuZDAwMHAtNDUsCisJMHgxLjlhMGYxNzBjYTA2MDRwLTEsCS0weDEuOGE0MHAtNDQsCisJMHgxLjliMmJiNGQ1M2ZmODlwLTEsCSAweDEuNTVjMHAtNDQsCisJMHgxLjljNDkxODJhM2YxNWJwLTEsCSAweDEuNmI4MHAtNDUsCisJMHgxLjlkNjc0MTk0YmI4YzVwLTEsCS0weDEuYzAwMHAtNDksCisJMHgxLjllODYzMTllMzIzOGVwLTEsCSAweDEuN2QwMHAtNDYsCisJMHgxLjlmYTVlOGQwN2YzMDJwLTEsCSAweDEuNjQwMHAtNDYsCisJMHgxLmEwYzY2N2I1ZGU1NGRwLTEsCS0weDEuNTAwMHAtNDgsCisJMHgxLmExZTdhZWQ4ZWI4ZjZwLTEsCSAweDEuOWUwMHAtNDcsCisJMHgxLmEzMDliZWM0YTJlMjdwLTEsCSAweDEuYWQ4MHAtNDUsCisJMHgxLmE0MmM5ODA0NjBhNWRwLTEsCS0weDEuYWYwMHAtNDYsCisJMHgxLmE1NTAzYjIzZTI1OWJwLTEsCSAweDEuYjYwMHAtNDcsCisJMHgxLmE2NzRhOGFmNDYyMTNwLTEsCSAweDEuODg4MHAtNDQsCisJMHgxLmE3OTllMTMzMGIzYTdwLTEsCSAweDEuMTIwMHAtNDYsCisJMHgxLmE4YmZlNTNjMTJlOGRwLTEsCSAweDEuNmMwMHAtNDcsCisJMHgxLmE5ZTZiNTU3OWZjZDJwLTEsCS0weDEuOWI4MHAtNDUsCisJMHgxLmFiMGU1MjEzNTZmYjhwLTEsCSAweDEuYjcwMHAtNDUsCisJMHgxLmFjMzZiYmZkM2YzODFwLTEsCSAweDEuOTAwMHAtNTAsCisJMHgxLmFkNWZmM2EzYzI3ODBwLTEsCSAweDEuNDAwMHAtNDksCisJMHgxLmFlODlmOTk1YWQyYTNwLTEsCS0weDEuYzkwMHAtNDUsCisJMHgxLmFmYjRjZTYyMmYzNjdwLTEsCSAweDEuNjUwMHAtNDYsCisJMHgxLmIwZTA3Mjk4ZGI3OTBwLTEsCSAweDEuZmQ0MHAtNDUsCisJMHgxLmIyMGNlNmM5YTg5YTlwLTEsCSAweDEuMjcwMHAtNDYsCisJMHgxLmIzM2EyYjg0ZjFhNGJwLTEsCSAweDEuZDQ3MHAtNDMsCisJMHgxLmI0Njg0MTViNzQ3ZTdwLTEsCS0weDEuODM4MHAtNDQsCisJMHgxLmI1OTcyOGRlNTU5M2FwLTEsCSAweDEuODAwMHAtNTQsCisJMHgxLmI2YzZlMjlmMWM1NmFwLTEsCSAweDEuYWQwMHAtNDcsCisJMHgxLmI3Zjc2ZjJmYjVlNTBwLTEsCSAweDEuZTgwMHAtNTAsCisJMHgxLmI5MjhjZjIyNzQ5YjJwLTEsCS0weDEuNGMwMHAtNDcsCisJMHgxLmJhNWIwMzBhMTA2MDNwLTEsCS0weDEuZDcwMHAtNDcsCisJMHgxLmJiOGUwYjc5YTZmNjZwLTEsCSAweDEuZDkwMHAtNDcsCisJMHgxLmJjYzFlOTA0YmMxZmZwLTEsCSAweDEuMmEwMHAtNDcsCisJMHgxLmJkZjY5YzNmM2ExNmZwLTEsCS0weDEuZjc4MHAtNDYsCisJMHgxLmJmMmMyNWJkNzFkYjhwLTEsCS0weDEuMGEwMHAtNDYsCisJMHgxLmMwNjI4NjE0MWIyZTlwLTEsCS0weDEuMTQwMHAtNDYsCisJMHgxLmMxOTliZGQ4NTUyZTBwLTEsCSAweDEuYmUwMHAtNDcsCisJMHgxLmMyZDFjZDlmYTY0ZWVwLTEsCS0weDEuOTQwMHAtNDcsCisJMHgxLmM0MGFiNWZmZmQwMmZwLTEsCS0weDEuZWQwMHAtNDcsCisJMHgxLmM1NDQ3NzhmYWZkMTVwLTEsCSAweDEuOTY2MHAtNDQsCisJMHgxLmM2N2YxMmU1N2QwY2JwLTEsCS0weDEuYTEwMHAtNDYsCisJMHgxLmM3YmE4ODk4OGMxYjZwLTEsCS0weDEuODQ1OHAtNDIsCisJMHgxLmM4ZjZkOTQwNmU3MzNwLTEsCS0weDEuYTQ4MHAtNDYsCisJMHgxLmNhMzQwNTc1MWM0ZGZwLTEsCSAweDEuYjAwMHAtNTEsCisJMHgxLmNiNzIwZGNlZjkwOTRwLTEsCSAweDEuMTQwMHAtNDcsCisJMHgxLmNjYjBmMmU2ZDE2ODlwLTEsCSAweDEuMDIwMHAtNDgsCisJMHgxLmNkZjBiNTU1ZGM0MTJwLTEsCSAweDEuMzYwMHAtNDgsCisJMHgxLmNmMzE1NWI1YmFiM2JwLTEsCS0weDEuNjkwMHAtNDcsCisJMHgxLmQwNzJkNGEwNzg5YmNwLTEsCSAweDEuOWEwMHAtNDcsCisJMHgxLmQxYjUzMmIwOGM4ZmFwLTEsCS0weDEuNWUwMHAtNDYsCisJMHgxLmQyZjg3MDgwZDhhODVwLTEsCSAweDEuZDI4MHAtNDYsCisJMHgxLmQ0M2M4ZWFjYWEyMDNwLTEsCSAweDEuMWEwMHAtNDcsCisJMHgxLmQ1ODE4ZGNmYmE0OTFwLTEsCSAweDEuZjAwMHAtNTAsCisJMHgxLmQ2Yzc2ZTg2MmU2YTFwLTEsCS0weDEuM2EwMHAtNDcsCisJMHgxLmQ4MGUzMTZjOTgzNGVwLTEsCS0weDEuY2Q4MHAtNDcsCisJMHgxLmQ5NTVkNzFmZjYwOTBwLTEsCSAweDEuNGMwMHAtNDgsCisJMHgxLmRhOWU2MDNkYjMyYWVwLTEsCSAweDEuZjkwMHAtNDgsCisJMHgxLmRiZTdjZDYzYTgzMjVwLTEsCSAweDEuOTgwMHAtNDksCisJMHgxLmRkMzIxZjMwMWI0NDVwLTEsCS0weDEuNTIwMHAtNDgsCisJMHgxLmRlN2Q1NjQxYzA1YmZwLTEsCS0weDEuZDcwMHAtNDYsCisJMHgxLmRmYzk3MzM3YjlhZWNwLTEsCS0weDEuNjE0MHAtNDYsCisJMHgxLmUxMTY3NmIxOTdkNWVwLTEsCSAweDEuYjQ4MHAtNDcsCisJMHgxLmUyNjQ2MTRmNWEzZTdwLTEsCSAweDEuMGNlMHAtNDMsCisJMHgxLmUzYjMzM2IxNmVlNWNwLTEsCSAweDEuYzY4MHAtNDcsCisJMHgxLmU1MDJlZTc4YjNmYjRwLTEsCS0weDEuOTMwMHAtNDcsCisJMHgxLmU2NTM5MjQ2NzZkNjhwLTEsCS0weDEuNTAwMHAtNDksCisJMHgxLmU3YTUxZmJjNzRjNDRwLTEsCS0weDEuN2Y4MHAtNDcsCisJMHgxLmU4Zjc5NzdjZGI3MjZwLTEsCS0weDEuMzcwMHAtNDgsCisJMHgxLmVhNGFmYTJhNDkwZThwLTEsCSAweDEuNWQwMHAtNDksCisJMHgxLmViOWY0ODY3Y2NhZTRwLTEsCSAweDEuNjFhMHAtNDYsCisJMHgxLmVjZjQ4MmQ4ZTY4MGRwLTEsCSAweDEuNTUwMHAtNDgsCisJMHgxLmVlNGFhYTIxODg1MTRwLTEsCSAweDEuNjQwMHAtNTEsCisJMHgxLmVmYTFiZWU2MTVhMTNwLTEsCS0weDEuZTgwMHAtNDksCisJMHgxLmYwZjljMWNiNjQxMDZwLTEsCS0weDEuYTg4MHAtNDgsCisJMHgxLmYyNTJiMzc2YmI5NjNwLTEsCS0weDEuYzkwMHAtNDUsCisJMHgxLmYzYWM5NDhkZDcyNzVwLTEsCSAweDEuYTAwMHAtNTMsCisJMHgxLmY1MDc2NWI2ZTQ1MjRwLTEsCS0weDEuNGYwMHAtNDgsCisJMHgxLmY2NjMyNzk4ODQ0ZmRwLTEsCSAweDEuYTgwMHAtNTEsCisJMHgxLmY3YmZkYWQ5Y2JlMzhwLTEsCSAweDEuYWJjMHAtNDgsCisJMHgxLmY5MWQ4MDIyNDNjODJwLTEsCS0weDEuNDYwMHAtNTAsCisJMHgxLmZhN2MxODE5ZTkwOGVwLTEsCS0weDEuYjBjMHAtNDcsCisJMHgxLmZiZGJhMzY5MmQ1MTFwLTEsCS0weDEuMGUwMHAtNTEsCisJMHgxLmZkM2MyMmI4ZjcxOTRwLTEsCS0weDEuMGRlOHAtNDYsCisJMHgxLmZlOWQ5NmIyYTIzZWVwLTEsCSAweDEuZTQzMHAtNDksCisJMHgxLjAwMDAwMDAwMDAwMDBwKzAsCSAweDAuMDAwMHArMCwKKwkweDEuMDBiMWFmYTVhYmNiZXArMCwJLTB4MS4zNDAwcC01MiwKKwkweDEuMDE2M2RhOWZiMzMwM3ArMCwJLTB4MS4yMTcwcC00NiwKKwkweDEuMDIxNjgxNDNiMDI4MnArMCwJIDB4MS5hNDAwcC01MiwKKwkweDEuMDJjOWEzZTc3ODA2Y3ArMCwJIDB4MS5mOTgwcC00OSwKKwkweDEuMDM3ZDQyZTExYmJjYXArMCwJLTB4MS43NDAwcC01MSwKKwkweDEuMDQzMTVlODZlN2Y4OXArMCwJIDB4MS44MzAwcC01MCwKKwkweDEuMDRlNWY3MmY2NTQ2N3ArMCwJLTB4MS5hM2YwcC00NiwKKwkweDEuMDU5YjBkMzE1ODU1YXArMCwJLTB4MS4yODQwcC00NywKKwkweDEuMDY1MGEwZTNjMWY5NXArMCwJIDB4MS4xNjAwcC00OCwKKwkweDEuMDcwNmIyOWRkZjcxYXArMCwJIDB4MS41MjQwcC00NiwKKwkweDEuMDdiZDQyYjcyYTgyZHArMCwJLTB4MS45YTAwcC00OSwKKwkweDEuMDg3NDUxODc1OWJkMHArMCwJIDB4MS42NDAwcC00OSwKKwkweDEuMDkyYmRmNjY2MDdjOHArMCwJLTB4MS4wNzgwcC00NywKKwkweDEuMDllM2VjYWM2ZjM4M3ArMCwJLTB4MS44MDAwcC01NCwKKwkweDEuMGE5Yzc5YjFmMzkzMHArMCwJIDB4MS5mYTAwcC00OCwKKwkweDEuMGI1NTg2Y2Y5ODhmY3ArMCwJLTB4MS5hYzgwcC00OCwKKwkweDEuMGMwZjE0NWU0NmM4YXArMCwJIDB4MS45YzAwcC01MCwKKwkweDEuMGNjOTIyYjcyNDgxNnArMCwJIDB4MS41MjAwcC00NywKKwkweDEuMGQ4M2IyMzM5NWRkOHArMCwJLTB4MS5hZDAwcC00OCwKKwkweDEuMGUzZWMzMmQzZDFmM3ArMCwJIDB4MS5iYWMwcC00NiwKKwkweDEuMGVmYTU1ZmRmYTlhNnArMCwJLTB4MS40ZTgwcC00NywKKwkweDEuMGZiNjZhZmZlZDJmMHArMCwJLTB4MS5kMzAwcC00NywKKwkweDEuMTA3MzAyOGQ3MjM0YnArMCwJIDB4MS4xNTAwcC00OCwKKwkweDEuMTEzMDFkMDEyNWI1YnArMCwJIDB4MS5jMDAwcC00OSwKKwkweDEuMTFlZGJhYjVlMmFmOXArMCwJIDB4MS42YmMwcC00NiwKKwkweDEuMTJhYmRjMDZjMzFkNXArMCwJIDB4MS44NDAwcC00OSwKKwkweDEuMTM2YTgxNGYyMDQ3ZHArMCwJLTB4MS5lZDAwcC00NywKKwkweDEuMTQyOWFhZWE5MmRlOXArMCwJIDB4MS44ZTAwcC00OSwKKwkweDEuMTRlOTU5MzRmMzEzOHArMCwJIDB4MS5iNDAwcC00OSwKKwkweDEuMTVhOThjOGE1OGU3MXArMCwJIDB4MS41MzAwcC00NywKKwkweDEuMTY2YTQ1NDcxYzNkZnArMCwJIDB4MS4zMzgwcC00NywKKwkweDEuMTcyYjgzYzdkNTIxMXArMCwJIDB4MS44ZDQwcC00NSwKKwkweDEuMTdlZDQ4Njk1YmI5ZnArMCwJLTB4MS41ZDAwcC00NywKKwkweDEuMThhZjkzODhjOGQ5M3ArMCwJLTB4MS5jODgwcC00NiwKKwkweDEuMTk3MjY1ODM3NWQ2NnArMCwJIDB4MS4xZjAwcC00NiwKKwkweDEuMWEzNWJlYjZmY2JhN3ArMCwJIDB4MS4wNDgwcC00NiwKKwkweDEuMWFmOTlmODEzODdlM3ArMCwJLTB4MS43MzkwcC00MywKKwkweDEuMWJiZTA4NDA0NWQ1NHArMCwJIDB4MS40ZTQwcC00NSwKKwkweDEuMWM4MmY5NTI4MWM0M3ArMCwJLTB4MS5hMjAwcC00NywKKwkweDEuMWQ0ODczMTY4YjliMnArMCwJIDB4MS4zODAwcC00OSwKKwkweDEuMWUwZTc1ZWI0NDAzMXArMCwJIDB4MS5hYzAwcC00OSwKKwkweDEuMWVkNTAyMmZjZDkzOHArMCwJIDB4MS4xOTAwcC00NywKKwkweDEuMWY5YzE4NDM4Y2RmN3ArMCwJLTB4MS5iNzgwcC00NiwKKwkweDEuMjA2M2I4ODYyOGQ4ZnArMCwJIDB4MS5kOTQwcC00NSwKKwkweDEuMjEyYmUzNTc4YTgxZXArMCwJIDB4MS44MDAwcC01MCwKKwkweDEuMjFmNDk5MTdkZGQ0MXArMCwJIDB4MS5iMzQwcC00NSwKKwkweDEuMjJiZGRhMjc5MTMyM3ArMCwJIDB4MS45ZjgwcC00NiwKKwkweDEuMjM4N2E2ZTc1NjFlN3ArMCwJLTB4MS45YzgwcC00NiwKKwkweDEuMjQ1MWZmYjgyMTQyN3ArMCwJIDB4MS4yMzAwcC00NywKKwkweDEuMjUxY2U0ZmIyYTYwMnArMCwJLTB4MS4zNDgwcC00NiwKKwkweDEuMjVlODU3MTFlY2ViMHArMCwJIDB4MS4yNzAwcC00NiwKKwkweDEuMjZiNDU2NWUyN2QxNnArMCwJIDB4MS4xZDAwcC00NiwKKwkweDEuMjc4MGUzNDFkZTAwZnArMCwJIDB4MS4xZWUwcC00NCwKKwkweDEuMjg0ZGZlMWY1NjMzZXArMCwJLTB4MS40YzAwcC00NiwKKwkweDEuMjkxYmE3NTkxYmIzMHArMCwJLTB4MS4zZDgwcC00NiwKKwkweDEuMjllOWRmNTFmZGYwOXArMCwJIDB4MS44YjAwcC00NywKKwkweDEuMmFiOGE2NmQxMGU5YnArMCwJLTB4MS4yN2MwcC00NSwKKwkweDEuMmI4N2ZkMGRhZGEzYXArMCwJIDB4MS5hMzQwcC00NSwKKwkweDEuMmM1N2UzOTc3MWFmOXArMCwJLTB4MS4wODAwcC00NiwKKwkweDEuMmQyODVhNmU0MDJkOXArMCwJLTB4MS5lZDAwcC00NywKKwkweDEuMmRmOTYxZjY0MTU3OXArMCwJLTB4MS40MjAwcC00OCwKKwkweDEuMmVjYWZhOTNlMmVjZnArMCwJLTB4MS40OTgwcC00NSwKKwkweDEuMmY5ZDI0YWJkODgyMnArMCwJLTB4MS42MzAwcC00NiwKKwkweDEuMzA2ZmUwYTMxYjYyNXArMCwJLTB4MS4yMzYwcC00NCwKKwkweDEuMzE0MzJlZGVlYTUwYnArMCwJLTB4MS4wZGY4cC00MCwKKwkweDEuMzIxNzBmYzRjZDdiOHArMCwJLTB4MS4yNDgwcC00NSwKKwkweDEuMzJlYjgzYmE4ZTlhMnArMCwJLTB4MS41OTgwcC00NSwKKwkweDEuMzNjMDhiMjY0MTc2NnArMCwJIDB4MS5lZDAwcC00NiwKKwkweDEuMzQ5NjI2NmUzZmEyN3ArMCwJLTB4MS5jMDAwcC01MCwKKwkweDEuMzU2YzU1ZjkyOWYwZnArMCwJLTB4MS4wZDgwcC00NCwKKwkweDEuMzY0MzFhMmRlODhiOXArMCwJIDB4MS4yYzgwcC00NSwKKwkweDEuMzcxYTczNzNhYWEzOXArMCwJIDB4MS4wNjAwcC00NSwKKwkweDEuMzdmMjYyMzFlNzRmZXArMCwJLTB4MS42NjAwcC00NiwKKwkweDEuMzhjYWU2ZDA1ZDgzOHArMCwJLTB4MS5hZTAwcC00NywKKwkweDEuMzlhNDAxYjcxM2VjM3ArMCwJLTB4MS40NzIwcC00MywKKwkweDEuM2E3ZGIzNGU1YTAyMHArMCwJIDB4MS44MjAwcC00NywKKwkweDEuM2I1N2ZiZmVjNmU5NXArMCwJIDB4MS5lODAwcC00NCwKKwkweDEuM2MzMmRjMzEzYThmMnArMCwJIDB4MS5mODAwcC00OSwKKwkweDEuM2QwZTU0NGVkZTEyMnArMCwJLTB4MS43YTAwcC00NiwKKwkweDEuM2RlYTY0YzEyMzRiYnArMCwJIDB4MS42MzAwcC00NSwKKwkweDEuM2VjNzBkZjFjNGVjY3ArMCwJLTB4MS44YTYwcC00MywKKwkweDEuM2ZhNDUwNGFjN2U4Y3ArMCwJLTB4MS5jZGMwcC00NCwKKwkweDEuNDA4MjJjMzY3YTBiYnArMCwJIDB4MS41YjgwcC00NSwKKwkweDEuNDE2MGEyMWY3MmU5NXArMCwJIDB4MS5lYzAwcC00NiwKKwkweDEuNDIzZmIyNzA5NDY0NnArMCwJLTB4MS4zNjAwcC00NiwKKwkweDEuNDMxZjVkOTUwYTkyMHArMCwJIDB4MS4zOTgwcC00NSwKKwkweDEuNDNmZmEzZjg0YjllYnArMCwJIDB4MS5hMDAwcC00OCwKKwkweDEuNDRlMDg2MDYxODkxOXArMCwJLTB4MS42YzAwcC00OCwKKwkweDEuNDVjMjA0MmE3ZDIwMXArMCwJLTB4MS5iYzAwcC00NywKKwkweDEuNDZhNDFlZDFkMDAxNnArMCwJLTB4MS4yODAwcC00NiwKKwkweDEuNDc4NmQ2NjhiMzMyNnArMCwJIDB4MS4wZTAwcC00NCwKKwkweDEuNDg2YTJiNWMxM2MwMHArMCwJLTB4MS5kNDAwcC00NSwKKwkweDEuNDk0ZTFlMTkyYWYwNHArMCwJIDB4MS5jMjAwcC00NywKKwkweDEuNGEzMmFmMGQ3ZDM3MnArMCwJLTB4MS5lNTAwcC00NiwKKwkweDEuNGIxN2RlYTZkYjgwMXArMCwJIDB4MS43ODAwcC00NywKKwkweDEuNGJmZGFkNTM2MjllMXArMCwJLTB4MS4zODAwcC00NiwKKwkweDEuNGNlNDFiODE3YzEzMnArMCwJIDB4MS4wODAwcC00NywKKwkweDEuNGRjYjI5OWZkZGRkYnArMCwJIDB4MS5jNzAwcC00NSwKKwkweDEuNGViMmQ4MWQ4YWI5NnArMCwJLTB4MS5jZTAwcC00NiwKKwkweDEuNGY5YjI3NjlkMmQwMnArMCwJIDB4MS45MjAwcC00NiwKKwkweDEuNTA4NDE3ZjQ1MzFjMXArMCwJLTB4MS44YzAwcC00NywKKwkweDEuNTE2ZGFhMmNmNjYyYXArMCwJLTB4MS5hMDAwcC00OCwKKwkweDEuNTI1N2RlODNmNTFlYXArMCwJIDB4MS5hMDgwcC00MywKKwkweDEuNTM0MmI1NjlkNGVkYXArMCwJLTB4MS42ZDgwcC00NSwKKwkweDEuNTQyZTJmNGY2YWMxYXArMCwJLTB4MS4yNDQwcC00NCwKKwkweDEuNTUxYTRjYTVkOTRkYnArMCwJIDB4MS44M2MwcC00MywKKwkweDEuNTYwNzBkZGU5MTE2YnArMCwJIDB4MS40YjAwcC00NSwKKwkweDEuNTZmNDczNmI1MjlkZXArMCwJIDB4MS4xNWEwcC00MywKKwkweDEuNTdlMjdkYmUyYzQwZXArMCwJLTB4MS45ZTAwcC00NSwKKwkweDEuNThkMTJkNDk3Yzc2ZnArMCwJLTB4MS4zMDgwcC00NSwKKwkweDEuNTljMDgyN2ZmMGI0Y3ArMCwJIDB4MS5kZWMwcC00MywKKwkweDEuNWFiMDdkZDQ4NTQyN3ArMCwJLTB4MS40MDAwcC01MSwKKwkweDEuNWJhMTFmYmE4N2FmNHArMCwJIDB4MS4wMDgwcC00NCwKKwkweDEuNWM5MjY4YTU5NDYwYnArMCwJLTB4MS42YzgwcC00NSwKKwkweDEuNWQ4NDU5MDk5OGUzZnArMCwJIDB4MS42OWEwcC00MywKKwkweDEuNWU3NmYxNWFkMjBlMXArMCwJLTB4MS5iNDAwcC00NiwKKwkweDEuNWY2YTMyMGRjZWJjYXArMCwJIDB4MS43NzAwcC00NiwKKwkweDEuNjA1ZTFiOTc2ZGNiOHArMCwJIDB4MS42ZjgwcC00NSwKKwkweDEuNjE1MmFlNmNkZjcxNXArMCwJIDB4MS4xMDAwcC00NywKKwkweDEuNjI0N2ViMDNhNTUzMXArMCwJLTB4MS41ZDAwcC00NiwKKwkweDEuNjMzZGQxZDE5MjliNXArMCwJLTB4MS4yZDAwcC00NiwKKwkweDEuNjQzNDYzNGNjYzMxM3ArMCwJLTB4MS5hODAwcC00OSwKKwkweDEuNjUyYjlmZWJjOGVmYXArMCwJLTB4MS44NjAwcC00NSwKKwkweDEuNjYyMzg4MjU1MzM5N3ArMCwJIDB4MS4xZmUwcC00MCwKKwkweDEuNjcxYzFjNzA4MzI4ZXArMCwJLTB4MS43MjAwcC00NCwKKwkweDEuNjgxNTVkNDRjYTk3ZXArMCwJIDB4MS42ODAwcC00OSwKKwkweDEuNjkwZjRiMTllOTQ3MXArMCwJLTB4MS45NzgwcC00NSwKK307CisKKy8qCisgKiBleHAyKHgpOiBjb21wdXRlIHRoZSBiYXNlIDIgZXhwb25lbnRpYWwgb2YgeAorICoKKyAqIEFjY3VyYWN5OiBQZWFrIGVycm9yIDwgMC41MDMgdWxwIGZvciBub3JtYWxpemVkIHJlc3VsdHMuCisgKgorICogTWV0aG9kOiAoYWNjdXJhdGUgdGFibGVzKQorICoKKyAqICAgUmVkdWNlIHg6CisgKiAgICAgeCA9IDIqKmsgKyB5LCBmb3IgaW50ZWdlciBrIGFuZCB8eXwgPD0gMS8yLgorICogICAgIFRodXMgd2UgaGF2ZSBleHAyKHgpID0gMioqayAqIGV4cDIoeSkuCisgKgorICogICBSZWR1Y2UgeToKKyAqICAgICB5ID0gaS9UQkxTSVpFICsgeiAtIGVwc1tpXSBmb3IgaW50ZWdlciBpIG5lYXIgeSAqIFRCTFNJWkUuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDIoeSkgPSBleHAyKGkvVEJMU0laRSkgKiBleHAyKHogLSBlcHNbaV0pLAorICogICAgIHdpdGggfHogLSBlcHNbaV18IDw9IDIqKi05ICsgMioqLTM5IGZvciB0aGUgdGFibGUgdXNlZC4KKyAqCisgKiAgIFdlIGNvbXB1dGUgZXhwMihpL1RCTFNJWkUpIHZpYSB0YWJsZSBsb29rdXAgYW5kIGV4cDIoeiAtIGVwc1tpXSkgdmlhCisgKiAgIGEgZGVncmVlLTUgbWluaW1heCBwb2x5bm9taWFsIHdpdGggbWF4aW11bSBlcnJvciB1bmRlciAxLjMgKiAyKiotNjEuCisgKiAgIFRoZSB2YWx1ZXMgaW4gZXhwMnRbXSBhbmQgZXBzW10gYXJlIGNob3NlbiBzdWNoIHRoYXQKKyAqICAgZXhwMnRbaV0gPSBleHAyKGkvVEJMU0laRSArIGVwc1tpXSksIGFuZCBlcHNbaV0gaXMgYSBzbWFsbCBvZmZzZXQgc3VjaAorICogICB0aGF0IGV4cDJ0W2ldIGlzIGFjY3VyYXRlIHRvIDIqKi02NC4KKyAqCisgKiAgIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgaSBpcyArLVRCTFNJWkUvMiwgc28gd2UgYWN0dWFsbHkgaW5kZXggdGhlIHRhYmxlcworICogICBieSBpMCA9IGkgKyBUQkxTSVpFLzIuICBGb3IgY2FjaGUgZWZmaWNpZW5jeSwgZXhwMnRbXSBhbmQgZXBzW10gYXJlCisgKiAgIHZpcnR1YWwgdGFibGVzLCBpbnRlcmxlYXZlZCBpbiB0aGUgcmVhbCB0YWJsZSB0YmxbXS4KKyAqCisgKiAgIFRoaXMgbWV0aG9kIGlzIGR1ZSB0byBHYWwsIHdpdGggbWFueSBkZXRhaWxzIGR1ZSB0byBHYWwgYW5kIEJhY2hlbGlzOgorICoKKyAqCUdhbCwgUy4gYW5kIEJhY2hlbGlzLCBCLiAgQW4gQWNjdXJhdGUgRWxlbWVudGFyeSBNYXRoZW1hdGljYWwgTGlicmFyeQorICoJZm9yIHRoZSBJRUVFIEZsb2F0aW5nIFBvaW50IFN0YW5kYXJkLiAgVE9NUyAxNygxKSwgMjYtNDYgKDE5OTEpLgorICovCitkb3VibGUKK2V4cDIoZG91YmxlIHgpCit7CisJZG91YmxlIHIsIHQsIHo7CisJdWludDMyX3QgaHgsIGhyLCBpeCwgbHgsIGkwOworCWludCBrOworCisJLyogRmlsdGVyIG91dCBleGNlcHRpb25hbCBjYXNlcy4gKi8KKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOwkJLyogaGlnaCB3b3JkIG9mIHx4fCAqLworCWlmKGl4ID49IDB4NDA5MDAwMDApIHsJCQkvKiB8eHwgPj0gMTAyNCAqLworCQlpZihpeCA+PSAweDdmZjAwMDAwKSB7CisJCQlHRVRfTE9XX1dPUkQobHgseCk7CisJCQlpZigoKGl4ICYgMHhmZmZmZikgfCBseCkgIT0gMCB8fCAoaHggJiAweDgwMDAwMDAwKSA9PSAwKQorCQkJCXJldHVybiAoeCk7IAkvKiB4IGlzIE5hTiBvciArSW5mICovCisJCQllbHNlIAorCQkJCXJldHVybiAoMC4wKTsJLyogeCBpcyAtSW5mICovCisJCX0KKwkJaWYoeCA+PSAweDEuMHAxMCkKKwkJCXJldHVybiAoaHVnZSAqIGh1Z2UpOyAvKiBvdmVyZmxvdyAqLworCQlpZih4IDw9IC0weDEuMGNjcDEwKQorCQkJcmV0dXJuICh0d29tMTAwMCAqIHR3b20xMDAwKTsgLyogdW5kZXJmbG93ICovCisJfSBlbHNlIGlmIChpeCA8IDB4M2M5MDAwMDApIHsJCS8qIHx4fCA8IDB4MXAtNTQgKi8KKwkJcmV0dXJuICgxLjAgKyB4KTsKKwl9CisKKwkvKiBSZWR1Y2UgeCwgY29tcHV0aW5nIHosIGkwLCBhbmQgay4gKi8KKwl0ID0geCArIHJlZHV4OworCUdFVF9MT1dfV09SRChpMCwgdCk7CisJaTAgKz0gVEJMU0laRSAvIDI7CisJayA9IChpMCA+PiBUQkxCSVRTKSA8PCAyMDsKKwlpMCA9IChpMCAmIChUQkxTSVpFIC0gMSkpIDw8IDE7CisJdCAtPSByZWR1eDsKKwl6ID0geCAtIHQ7CisKKwkvKiBDb21wdXRlIHIgPSBleHAyKHkpID0gZXhwMnRbaTBdICogcCh6IC0gZXBzW2ldKS4gKi8KKwl0ID0gdGJsW2kwXTsJCS8qIGV4cDJ0W2kwXSAqLworCXogLT0gdGJsW2kwICsgMV07CS8qIGVwc1tpMF0gICAqLworCXIgPSB0ICsgdCAqIHogKiAoUDEgKyB6ICogKFAyICsgeiAqIChQMyArIHogKiAoUDQgKyB6ICogUDUpKSkpOworCisJLyogU2NhbGUgYnkgMioqKGs+PjIwKS4gKi8KKwlpZihrID49IC0xMDIxIDw8IDIwKSB7CisJCWlmIChrICE9IDApIHsKKwkJCUdFVF9ISUdIX1dPUkQoaHIsIHIpOworCQkJU0VUX0hJR0hfV09SRChyLCBociArIGspOworCQl9CisJCXJldHVybiAocik7CisJfSBlbHNlIHsKKwkJR0VUX0hJR0hfV09SRChociwgcik7CisJCVNFVF9ISUdIX1dPUkQociwgaHIgKyAoayArICgxMDAwIDw8IDIwKSkpOworCQlyZXR1cm4gKHIgKiB0d29tMTAwMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19leHAyZi5jIGIvbGlibS9zcmMvc19leHAyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOThlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2V4cDJmLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwMmYuYyx2IDEuMSAyMDA1LzA0LzA1IDAyOjU3OjE1IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjZGVmaW5lCVRCTEJJVFMJNAorI2RlZmluZQlUQkxTSVpFCSgxIDw8IFRCTEJJVFMpCisKK3N0YXRpYyBjb25zdCBmbG9hdAorICAgIGh1Z2UgICAgPSAweDFwMTAwZiwKKyAgICB0d29tMTAwID0gMHgxcC0xMDBmLAorICAgIHJlZHV4ICAgPSAweDEuOHAyM2YgLyBUQkxTSVpFLAorICAgIFAxCSAgICA9IDB4MS42MmU0MzBwLTFmLAorICAgIFAyCSAgICA9IDB4MS5lYmZiZTBwLTNmLAorICAgIFAzCSAgICA9IDB4MS5jNmIzNDhwLTVmLAorICAgIFA0CSAgICA9IDB4MS4zYjJjOWNwLTdmOworCitzdGF0aWMgY29uc3QgZG91YmxlIGV4cDJmdFtUQkxTSVpFXSA9IHsKKwkweDEuNmEwOWU2NjdmM2JjZHAtMSwKKwkweDEuN2ExMTQ3M2ViMDE4N3AtMSwKKwkweDEuOGFjZTU0MjJhYTBkYnAtMSwKKwkweDEuOWM0OTE4MmEzZjA5MHAtMSwKKwkweDEuYWU4OWY5OTVhZDNhZHAtMSwKKwkweDEuYzE5OWJkZDg1NTI5Y3AtMSwKKwkweDEuZDU4MThkY2ZiYTQ4N3AtMSwKKwkweDEuZWE0YWZhMmE0OTBkYXAtMSwKKwkweDEuMDAwMDAwMDAwMDAwMHArMCwKKwkweDEuMGI1NTg2Y2Y5ODkwZnArMCwKKwkweDEuMTcyYjgzYzdkNTE3YnArMCwKKwkweDEuMjM4N2E2ZTc1NjIzOHArMCwKKwkweDEuMzA2ZmUwYTMxYjcxNXArMCwKKwkweDEuM2RlYTY0YzEyMzQyMnArMCwKKwkweDEuNGJmZGFkNTM2MmEyN3ArMCwKKwkweDEuNWFiMDdkZDQ4NTQyOXArMCwKK307CisJCisvKgorICogZXhwMmYoeCk6IGNvbXB1dGUgdGhlIGJhc2UgMiBleHBvbmVudGlhbCBvZiB4CisgKgorICogQWNjdXJhY3k6IFBlYWsgZXJyb3IgPCAwLjUwMSB1bHA7IGxvY2F0aW9uIG9mIHBlYWs6IC0wLjAzMDExMDkyNy4KKyAqCisgKiBNZXRob2Q6IChlcXVhbGx5LXNwYWNlZCB0YWJsZXMpCisgKgorICogICBSZWR1Y2UgeDoKKyAqICAgICB4ID0gMioqayArIHksIGZvciBpbnRlZ2VyIGsgYW5kIHx5fCA8PSAxLzIuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDJmKHgpID0gMioqayAqIGV4cDIoeSkuCisgKgorICogICBSZWR1Y2UgeToKKyAqICAgICB5ID0gaS9UQkxTSVpFICsgeiBmb3IgaW50ZWdlciBpIG5lYXIgeSAqIFRCTFNJWkUuCisgKiAgICAgVGh1cyB3ZSBoYXZlIGV4cDIoeSkgPSBleHAyKGkvVEJMU0laRSkgKiBleHAyKHopLAorICogICAgIHdpdGggfHp8IDw9IDIqKi0oVEJMU0laRSsxKS4KKyAqCisgKiAgIFdlIGNvbXB1dGUgZXhwMihpL1RCTFNJWkUpIHZpYSB0YWJsZSBsb29rdXAgYW5kIGV4cDIoeikgdmlhIGEKKyAqICAgZGVncmVlLTQgbWluaW1heCBwb2x5bm9taWFsIHdpdGggbWF4aW11bSBlcnJvciB1bmRlciAxLjQgKiAyKiotMzMuCisgKiAgIFVzaW5nIGRvdWJsZSBwcmVjaXNpb24gaW4gdGhlIGZpbmFsIGNhbGN1bGF0aW9uIGF2b2lkcyByb3VuZG9mZiBlcnJvci4KKyAqCisgKiAgIFRoaXMgbWV0aG9kIGlzIGR1ZSB0byBUYW5nLCBidXQgSSBkbyBub3QgdXNlIGhpcyBzdWdnZXN0ZWQgcGFyYW1ldGVyczoKKyAqCisgKglUYW5nLCBQLiAgVGFibGUtZHJpdmVuIEltcGxlbWVudGF0aW9uIG9mIHRoZSBFeHBvbmVudGlhbCBGdW5jdGlvbgorICoJaW4gSUVFRSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLiAgVE9NUyAxNSgyKSwgMTQ0LTE1NyAoMTk4OSkuCisgKi8KK2Zsb2F0CitleHAyZihmbG9hdCB4KQoreworCWRvdWJsZSB0djsKKwlmbG9hdCByLCB6OworCXZvbGF0aWxlIGZsb2F0IHQ7CS8qIHByZXZlbnQgZ2NjIGZyb20gdXNpbmcgdG9vIG11Y2ggcHJlY2lzaW9uICovCisJdWludDMyX3QgaHgsIGhyLCBpeCwgaTA7CisJaW50MzJfdCBrOworCisJLyogRmlsdGVyIG91dCBleGNlcHRpb25hbCBjYXNlcy4gKi8KKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IGh4ICYgMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKwlpZihpeCA+PSAweDQzMDAwMDAwKSB7CQkJLyogfHh8ID49IDEyOCAqLworCQlpZihpeCA+PSAweDdmODAwMDAwKSB7CisJCQlpZiAoKGl4ICYgMHg3ZmZmZmYpICE9IDAgfHwgKGh4ICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOyAJLyogeCBpcyBOYU4gb3IgK0luZiAqLworCQkJZWxzZSAKKwkJCQlyZXR1cm4gKDAuMCk7CS8qIHggaXMgLUluZiAqLworCQl9CisJCWlmKHggPj0gMHgxLjBwN2YpCisJCQlyZXR1cm4gKGh1Z2UgKiBodWdlKTsJLyogb3ZlcmZsb3cgKi8KKwkJaWYoeCA8PSAtMHgxLjJjcDdmKQorCQkJcmV0dXJuICh0d29tMTAwICogdHdvbTEwMCk7IC8qIHVuZGVyZmxvdyAqLworCX0gZWxzZSBpZiAoaXggPD0gMHgzMzAwMDAwMCkgewkJLyogfHh8IDw9IDB4MXAtMjUgKi8KKwkJcmV0dXJuICgxLjBmICsgeCk7CisJfQorCisJLyogUmVkdWNlIHgsIGNvbXB1dGluZyB6LCBpMCwgYW5kIGsuICovCisJdCA9IHggKyByZWR1eDsKKwlHRVRfRkxPQVRfV09SRChpMCwgdCk7CisJaTAgKz0gVEJMU0laRSAvIDI7CisJayA9IChpMCA+PiBUQkxCSVRTKSA8PCAyMzsKKwlpMCAmPSBUQkxTSVpFIC0gMTsKKwl0IC09IHJlZHV4OworCXogPSB4IC0gdDsKKworCS8qIENvbXB1dGUgciA9IGV4cDIoeSkgPSBleHAyZnRbaTBdICogcCh6KS4gKi8KKwl0diA9IGV4cDJmdFtpMF07CisJciA9IHR2ICsgdHYgKiAoeiAqIChQMSArIHogKiAoUDIgKyB6ICogKFAzICsgeiAqIFA0KSkpKTsKKworCS8qIFNjYWxlIGJ5IDIqKihrPj4yMykuICovCisJaWYoayA+PSAtMTI1IDw8IDIzKSB7CisJCWlmIChrICE9IDApIHsKKwkJCUdFVF9GTE9BVF9XT1JEKGhyLCByKTsKKwkJCVNFVF9GTE9BVF9XT1JEKHIsIGhyICsgayk7CisJCX0KKwkJcmV0dXJuIChyKTsKKwl9IGVsc2UgeworCQlHRVRfRkxPQVRfV09SRChociwgcik7CisJCVNFVF9GTE9BVF9XT1JEKHIsIGhyICsgKGsgKyAoMTAwIDw8IDIzKSkpOworCQlyZXR1cm4gKHIgKiB0d29tMTAwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cG0xLmMgYi9saWJtL3NyYy9zX2V4cG0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhYTNmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZXhwbTEuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogQCgjKXNfZXhwbTEuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwbTEuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyogZXhwbTEoeCkKKyAqIFJldHVybnMgZXhwKHgpLTEsIHRoZSBleHBvbmVudGlhbCBvZiB4IG1pbnVzIDEuCisgKgorICogTWV0aG9kCisgKiAgIDEuIEFyZ3VtZW50IHJlZHVjdGlvbjoKKyAqCUdpdmVuIHgsIGZpbmQgciBhbmQgaW50ZWdlciBrIHN1Y2ggdGhhdAorICoKKyAqICAgICAgICAgICAgICAgeCA9IGsqbG4yICsgciwgIHxyfCA8PSAwLjUqbG4yIH4gMC4zNDY1OAorICoKKyAqICAgICAgSGVyZSBhIGNvcnJlY3Rpb24gdGVybSBjIHdpbGwgYmUgY29tcHV0ZWQgdG8gY29tcGVuc2F0ZQorICoJdGhlIGVycm9yIGluIHIgd2hlbiByb3VuZGVkIHRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICoKKyAqICAgMi4gQXBwcm94aW1hdGluZyBleHBtMShyKSBieSBhIHNwZWNpYWwgcmF0aW9uYWwgZnVuY3Rpb24gb24KKyAqCXRoZSBpbnRlcnZhbCBbMCwwLjM0NjU4XToKKyAqCVNpbmNlCisgKgkgICAgciooZXhwKHIpKzEpLyhleHAociktMSkgPSAyKyByXjIvNiAtIHJeNC8zNjAgKyAuLi4KKyAqCXdlIGRlZmluZSBSMShyKnIpIGJ5CisgKgkgICAgciooZXhwKHIpKzEpLyhleHAociktMSkgPSAyKyByXjIvNiAqIFIxKHIqcikKKyAqCVRoYXQgaXMsCisgKgkgICAgUjEocioqMikgPSA2L3IgKigoZXhwKHIpKzEpLyhleHAociktMSkgLSAyL3IpCisgKgkJICAgICA9IDYvciAqICggMSArIDIuMCooMS8oZXhwKHIpLTEpIC0gMS9yKSkKKyAqCQkgICAgID0gMSAtIHJeMi82MCArIHJeNC8yNTIwIC0gcl42LzEwMDgwMCArIC4uLgorICogICAgICBXZSB1c2UgYSBzcGVjaWFsIFJlbWUgYWxnb3JpdGhtIG9uIFswLDAuMzQ3XSB0byBnZW5lcmF0ZQorICogCWEgcG9seW5vbWlhbCBvZiBkZWdyZWUgNSBpbiByKnIgdG8gYXBwcm94aW1hdGUgUjEuIFRoZQorICoJbWF4aW11bSBlcnJvciBvZiB0aGlzIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiBpcyBib3VuZGVkCisgKglieSAyKiotNjEuIEluIG90aGVyIHdvcmRzLAorICoJICAgIFIxKHopIH4gMS4wICsgUTEqeiArIFEyKnoqKjIgKyBRMyp6KiozICsgUTQqeioqNCArIFE1KnoqKjUKKyAqCXdoZXJlIAlRMSAgPSAgLTEuNjY2NjY2NjY2NjY2NjU2NzM4NEUtMiwKKyAqIAkJUTIgID0gICAzLjk2ODI1Mzk2ODEzNzAzNjU4NzNFLTQsCisgKiAJCVEzICA9ICAtOS45MjA2MzQ0NzMzNDM1OTg3MzU3RS02LAorICogCQlRNCAgPSAgIDIuNTA1MTM2MTQyMDgwODUxNzAwMkUtNywKKyAqIAkJUTUgID0gIC02LjI4NDM1MDU2ODIzODI2MTcxMDJFLTk7CisgKiAgCSh3aGVyZSB6PXIqciwgYW5kIHRoZSB2YWx1ZXMgb2YgUTEgdG8gUTUgYXJlIGxpc3RlZCBiZWxvdykKKyAqCXdpdGggZXJyb3IgYm91bmRlZCBieQorICoJICAgIHwgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICB8ICAgICAtNjEKKyAqCSAgICB8IDEuMCtRMSp6Ky4uLitRNSp6ICAgLSAgUjEoeikgfCA8PSAyCisgKgkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCisgKglleHBtMShyKSA9IGV4cChyKS0xIGlzIHRoZW4gY29tcHV0ZWQgYnkgdGhlIGZvbGxvd2luZworICogCXNwZWNpZmljIHdheSB3aGljaCBtaW5pbWl6ZSB0aGUgYWNjdW11bGF0aW9uIHJvdW5kaW5nIGVycm9yOgorICoJCQkgICAgICAgMiAgICAgMworICoJCQkgICAgICByICAgICByICAgIFsgMyAtIChSMSArIFIxKnIvMikgIF0KKyAqCSAgICAgIGV4cG0xKHIpID0gciArIC0tLSArIC0tLSAqIFstLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAqCQkgICAgICAgICAgICAgIDIgICAgIDIgICAgWyA2IC0gciooMyAtIFIxKnIvMikgXQorICoKKyAqCVRvIGNvbXBlbnNhdGUgdGhlIGVycm9yIGluIHRoZSBhcmd1bWVudCByZWR1Y3Rpb24sIHdlIHVzZQorICoJCWV4cG0xKHIrYykgPSBleHBtMShyKSArIGMgKyBleHBtMShyKSpjCisgKgkJCSAgIH4gZXhwbTEocikgKyBjICsgcipjCisgKglUaHVzIGMrcipjIHdpbGwgYmUgYWRkZWQgaW4gYXMgdGhlIGNvcnJlY3Rpb24gdGVybXMgZm9yCisgKglleHBtMShyK2MpLiBOb3cgcmVhcnJhbmdlIHRoZSB0ZXJtIHRvIGF2b2lkIG9wdGltaXphdGlvbgorICogCXNjcmV3IHVwOgorICoJCSAgICAgICAgKCAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICkKKyAqCQkgICAgICAgICh7ICAoIHIgICAgWyBSMSAtICAoMyAtIFIxKnIvMikgXSAgKSAgfSAgICByICApCisgKgkgZXhwbTEocitjKX5yIC0gKHtyKigtLS0gKiBbLS0tLS0tLS0tLS0tLS0tLS0tLS1dLWMpLWN9IC0gLS0tICkKKyAqCSAgICAgICAgICAgICAgICAoeyAgKCAyICAgIFsgNiAtIHIqKDMgLSBSMSpyLzIpIF0gICkgIH0gICAgMiAgKQorICogICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAqCisgKgkJICAgPSByIC0gRQorICogICAzLiBTY2FsZSBiYWNrIHRvIG9idGFpbiBleHBtMSh4KToKKyAqCUZyb20gc3RlcCAxLCB3ZSBoYXZlCisgKgkgICBleHBtMSh4KSA9IGVpdGhlciAyXmsqW2V4cG0xKHIpKzFdIC0gMQorICoJCSAgICA9IG9yICAgICAyXmsqW2V4cG0xKHIpICsgKDEtMl4tayldCisgKiAgIDQuIEltcGxlbWVudGF0aW9uIG5vdGVzOgorICoJKEEpLiBUbyBzYXZlIG9uZSBtdWx0aXBsaWNhdGlvbiwgd2Ugc2NhbGUgdGhlIGNvZWZmaWNpZW50IFFpCisgKgkgICAgIHRvIFFpKjJeaSwgYW5kIHJlcGxhY2UgeiBieSAoeF4yKS8yLgorICoJKEIpLiBUbyBhY2hpZXZlIG1heGltdW0gYWNjdXJhY3ksIHdlIGNvbXB1dGUgZXhwbTEoeCkgYnkKKyAqCSAgKGkpICAgaWYgeCA8IC01NipsbjIsIHJldHVybiAtMS4wLCAocmFpc2UgaW5leGFjdCBpZiB4IT1pbmYpCisgKgkgIChpaSkgIGlmIGs9MCwgcmV0dXJuIHItRQorICoJICAoaWlpKSBpZiBrPS0xLCByZXR1cm4gMC41KihyLUUpLTAuNQorICogICAgICAgIChpdikJaWYgaz0xIGlmIHIgPCAtMC4yNSwgcmV0dXJuIDIqKChyKzAuNSktIEUpCisgKgkgICAgICAgCSAgICAgICBlbHNlCSAgICAgcmV0dXJuICAxLjArMi4wKihyLUUpOworICoJICAodikgICBpZiAoazwtMnx8az41NikgcmV0dXJuIDJeaygxLShFLXIpKSAtIDEgKG9yIGV4cCh4KS0xKQorICoJICAodmkpICBpZiBrIDw9IDIwLCByZXR1cm4gMl5rKCgxLTJeLWspLShFLXIpKSwgZWxzZQorICoJICAodmlpKSByZXR1cm4gMl5rKDEtKChFKzJeLWspLXIpKQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKglleHBtMShJTkYpIGlzIElORiwgZXhwbTEoTmFOKSBpcyBOYU47CisgKglleHBtMSgtSU5GKSBpcyAtMSwgYW5kCisgKglmb3IgZmluaXRlIGFyZ3VtZW50LCBvbmx5IGV4cG0xKDApPTAgaXMgZXhhY3QuCisgKgorICogQWNjdXJhY3k6CisgKglhY2NvcmRpbmcgdG8gYW4gZXJyb3IgYW5hbHlzaXMsIHRoZSBlcnJvciBpcyBhbHdheXMgbGVzcyB0aGFuCisgKgkxIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkuCisgKgorICogTWlzYy4gaW5mby4KKyAqCUZvciBJRUVFIGRvdWJsZQorICoJICAgIGlmIHggPiAgNy4wOTc4MjcxMjg5MzM4Mzk3MzA5NmUrMDIgdGhlbiBleHBtMSh4KSBvdmVyZmxvdworICoKKyAqIENvbnN0YW50czoKKyAqIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgYXJlIHRoZSBpbnRlbmRlZCBvbmVzIGZvciB0aGUgZm9sbG93aW5nCisgKiBjb25zdGFudHMuIFRoZSBkZWNpbWFsIHZhbHVlcyBtYXkgYmUgdXNlZCwgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGNvbXBpbGVyIHdpbGwgY29udmVydCBmcm9tIGRlY2ltYWwgdG8gYmluYXJ5IGFjY3VyYXRlbHkgZW5vdWdoCisgKiB0byBwcm9kdWNlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZXMgc2hvd24uCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorb25lCQk9IDEuMCwKK2h1Z2UJCT0gMS4wZSszMDAsCit0aW55CQk9IDEuMGUtMzAwLAorb190aHJlc2hvbGQJPSA3LjA5NzgyNzEyODkzMzgzOTczMDk2ZSswMiwvKiAweDQwODYyRTQyLCAweEZFRkEzOUVGICovCitsbjJfaGkJCT0gNi45MzE0NzE4MDM2OTEyMzgxNjQ5MGUtMDEsLyogMHgzZmU2MmU0MiwgMHhmZWUwMDAwMCAqLworbG4yX2xvCQk9IDEuOTA4MjE0OTI5MjcwNTg3NzAwMDJlLTEwLC8qIDB4M2RlYTM5ZWYsIDB4MzU3OTNjNzYgKi8KK2ludmxuMgkJPSAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwZSswMCwvKiAweDNmZjcxNTQ3LCAweDY1MmI4MmZlICovCisJLyogc2NhbGVkIGNvZWZmaWNpZW50cyByZWxhdGVkIHRvIGV4cG0xICovCitRMSAgPSAgLTMuMzMzMzMzMzMzMzMzMzEzMTY0MjhlLTAyLCAvKiBCRkExMTExMSAxMTExMTBGNCAqLworUTIgID0gICAxLjU4NzMwMTU4NzI1NDgxNDYwMTY1ZS0wMywgLyogM0Y1QTAxQTAgMTlGRTU1ODUgKi8KK1EzICA9ICAtNy45MzY1MDc1Nzg2NzQ4Nzk0MjQ3M2UtMDUsIC8qIEJGMTRDRTE5IDlFQUFEQkI3ICovCitRNCAgPSAgIDQuMDA4MjE3ODI3MzI5MzYyMzk1NTJlLTA2LCAvKiAzRUQwQ0ZDQSA4NkU2NTIzOSAqLworUTUgID0gIC0yLjAxMDk5MjE4MTgzNjI0MzcxMzI2ZS0wNzsgLyogQkU4QUZEQjcgNkUwOUMzMkQgKi8KKworZG91YmxlCitleHBtMShkb3VibGUgeCkKK3sKKwlkb3VibGUgeSxoaSxsbyxjLHQsZSxoeHMsaGZ4LHIxOworCWludDMyX3Qgayx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0hJR0hfV09SRChoeCx4KTsKKwl4c2IgPSBoeCYweDgwMDAwMDAwOwkJLyogc2lnbiBiaXQgb2YgeCAqLworCWlmKHhzYj09MCkgeT14OyBlbHNlIHk9IC14OwkvKiB5ID0gfHh8ICovCisJaHggJj0gMHg3ZmZmZmZmZjsJCS8qIGhpZ2ggd29yZCBvZiB8eHwgKi8KKworICAgIC8qIGZpbHRlciBvdXQgaHVnZSBhbmQgbm9uLWZpbml0ZSBhcmd1bWVudCAqLworCWlmKGh4ID49IDB4NDA0MzY4N0EpIHsJCQkvKiBpZiB8eHw+PTU2KmxuMiAqLworCSAgICBpZihoeCA+PSAweDQwODYyRTQyKSB7CQkvKiBpZiB8eHw+PTcwOS43OC4uLiAqLworICAgICAgICAgICAgICAgIGlmKGh4Pj0weDdmZjAwMDAwKSB7CisJCSAgICB1X2ludDMyX3QgbG93OworCQkgICAgR0VUX0xPV19XT1JEKGxvdyx4KTsKKwkJICAgIGlmKCgoaHgmMHhmZmZmZil8bG93KSE9MCkKKwkJICAgICAgICAgcmV0dXJuIHgreDsgCSAvKiBOYU4gKi8KKwkJICAgIGVsc2UgcmV0dXJuICh4c2I9PTApPyB4Oi0xLjA7LyogZXhwKCstaW5mKT17aW5mLC0xfSAqLworCSAgICAgICAgfQorCSAgICAgICAgaWYoeCA+IG9fdGhyZXNob2xkKSByZXR1cm4gaHVnZSpodWdlOyAvKiBvdmVyZmxvdyAqLworCSAgICB9CisJICAgIGlmKHhzYiE9MCkgeyAvKiB4IDwgLTU2KmxuMiwgcmV0dXJuIC0xLjAgd2l0aCBpbmV4YWN0ICovCisJCWlmKHgrdGlueTwwLjApCQkvKiByYWlzZSBpbmV4YWN0ICovCisJCXJldHVybiB0aW55LW9uZTsJLyogcmV0dXJuIC0xICovCisJICAgIH0KKwl9CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gKi8KKwlpZihoeCA+IDB4M2ZkNjJlNDIpIHsJCS8qIGlmICB8eHwgPiAwLjUgbG4yICovCisJICAgIGlmKGh4IDwgMHgzRkYwQTJCMikgewkvKiBhbmQgfHh8IDwgMS41IGxuMiAqLworCQlpZih4c2I9PTApCisJCSAgICB7aGkgPSB4IC0gbG4yX2hpOyBsbyA9ICBsbjJfbG87ICBrID0gIDE7fQorCQllbHNlCisJCSAgICB7aGkgPSB4ICsgbG4yX2hpOyBsbyA9IC1sbjJfbG87ICBrID0gLTE7fQorCSAgICB9IGVsc2UgeworCQlrICA9IGludmxuMip4KygoeHNiPT0wKT8wLjU6LTAuNSk7CisJCXQgID0gazsKKwkJaGkgPSB4IC0gdCpsbjJfaGk7CS8qIHQqbG4yX2hpIGlzIGV4YWN0IGhlcmUgKi8KKwkJbG8gPSB0KmxuMl9sbzsKKwkgICAgfQorCSAgICB4ICA9IGhpIC0gbG87CisJICAgIGMgID0gKGhpLXgpLWxvOworCX0KKwllbHNlIGlmKGh4IDwgMHgzYzkwMDAwMCkgeyAgCS8qIHdoZW4gfHh8PDIqKi01NCwgcmV0dXJuIHggKi8KKwkgICAgdCA9IGh1Z2UreDsJLyogcmV0dXJuIHggd2l0aCBpbmV4YWN0IGZsYWdzIHdoZW4geCE9MCAqLworCSAgICByZXR1cm4geCAtICh0LShodWdlK3gpKTsKKwl9CisJZWxzZSBrID0gMDsKKworICAgIC8qIHggaXMgbm93IGluIHByaW1hcnkgcmFuZ2UgKi8KKwloZnggPSAwLjUqeDsKKwloeHMgPSB4KmhmeDsKKwlyMSA9IG9uZStoeHMqKFExK2h4cyooUTIraHhzKihRMytoeHMqKFE0K2h4cypRNSkpKSk7CisJdCAgPSAzLjAtcjEqaGZ4OworCWUgID0gaHhzKigocjEtdCkvKDYuMCAtIHgqdCkpOworCWlmKGs9PTApIHJldHVybiB4IC0gKHgqZS1oeHMpOwkJLyogYyBpcyAwICovCisJZWxzZSB7CisJICAgIGUgID0gKHgqKGUtYyktYyk7CisJICAgIGUgLT0gaHhzOworCSAgICBpZihrPT0gLTEpIHJldHVybiAwLjUqKHgtZSktMC41OworCSAgICBpZihrPT0xKQorCSAgICAgICAJaWYoeCA8IC0wLjI1KSByZXR1cm4gLTIuMCooZS0oeCswLjUpKTsKKwkgICAgICAgCWVsc2UgCSAgICAgIHJldHVybiAgb25lKzIuMCooeC1lKTsKKwkgICAgaWYgKGsgPD0gLTIgfHwgaz41NikgeyAgIC8qIHN1ZmZpY2UgdG8gcmV0dXJuIGV4cCh4KS0xICovCisJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkgICAgICAgIHkgPSBvbmUtKGUteCk7CisJCUdFVF9ISUdIX1dPUkQoaGlnaCx5KTsKKwkJU0VUX0hJR0hfV09SRCh5LGhpZ2grKGs8PDIwKSk7CS8qIGFkZCBrIHRvIHkncyBleHBvbmVudCAqLworCSAgICAgICAgcmV0dXJuIHktb25lOworCSAgICB9CisJICAgIHQgPSBvbmU7CisJICAgIGlmKGs8MjApIHsKKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCSAgICAgICAgU0VUX0hJR0hfV09SRCh0LDB4M2ZmMDAwMDAgLSAoMHgyMDAwMDA+PmspKTsgIC8qIHQ9MS0yXi1rICovCisJICAgICAgIAl5ID0gdC0oZS14KTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHkpOworCQlTRVRfSElHSF9XT1JEKHksaGlnaCsoazw8MjApKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgfSBlbHNlIHsKKwkgICAgICAgIHVfaW50MzJfdCBoaWdoOworCQlTRVRfSElHSF9XT1JEKHQsKCgweDNmZi1rKTw8MjApKTsJLyogMl4tayAqLworCSAgICAgICAJeSA9IHgtKGUrdCk7CisJICAgICAgIAl5ICs9IG9uZTsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHkpOworCQlTRVRfSElHSF9XT1JEKHksaGlnaCsoazw8MjApKTsJLyogYWRkIGsgdG8geSdzIGV4cG9uZW50ICovCisJICAgIH0KKwl9CisJcmV0dXJuIHk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2V4cG0xZi5jIGIvbGlibS9zcmMvc19leHBtMWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcwYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19leHBtMWYuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogc19leHBtMWYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfZXhwbTEuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZXhwbTFmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAorb25lCQk9IDEuMCwKK2h1Z2UJCT0gMS4wZSszMCwKK3RpbnkJCT0gMS4wZS0zMCwKK29fdGhyZXNob2xkCT0gOC44NzIxNjc5Njg4ZSswMSwvKiAweDQyYjE3MTgwICovCitsbjJfaGkJCT0gNi45MzEzODEyMjU2ZS0wMSwvKiAweDNmMzE3MTgwICovCitsbjJfbG8JCT0gOS4wNTgwMDA2MTQ1ZS0wNiwvKiAweDM3MTdmN2QxICovCitpbnZsbjIJCT0gMS40NDI2OTUwMjE2ZSswMCwvKiAweDNmYjhhYTNiICovCisJLyogc2NhbGVkIGNvZWZmaWNpZW50cyByZWxhdGVkIHRvIGV4cG0xICovCitRMSAgPSAgLTMuMzMzMzMzNTA3MmUtMDIsIC8qIDB4YmQwODg4ODkgKi8KK1EyICA9ICAgMS41ODczMDE2MDkxZS0wMywgLyogMHgzYWQwMGQwMSAqLworUTMgID0gIC03LjkzNjUwNzYwOTBlLTA1LCAvKiAweGI4YTY3MGNkICovCitRNCAgPSAgIDQuMDA4MjE3NzI5M2UtMDYsIC8qIDB4MzY4NjdlNTQgKi8KK1E1ICA9ICAtMi4wMTA5OTIxMTk1ZS0wNzsgLyogMHhiNDU3ZWRiYiAqLworCitmbG9hdAorZXhwbTFmKGZsb2F0IHgpCit7CisJZmxvYXQgeSxoaSxsbyxjLHQsZSxoeHMsaGZ4LHIxOworCWludDMyX3Qgayx4c2I7CisJdV9pbnQzMl90IGh4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJeHNiID0gaHgmMHg4MDAwMDAwMDsJCS8qIHNpZ24gYml0IG9mIHggKi8KKwlpZih4c2I9PTApIHk9eDsgZWxzZSB5PSAteDsJLyogeSA9IHx4fCAqLworCWh4ICY9IDB4N2ZmZmZmZmY7CQkvKiBoaWdoIHdvcmQgb2YgfHh8ICovCisKKyAgICAvKiBmaWx0ZXIgb3V0IGh1Z2UgYW5kIG5vbi1maW5pdGUgYXJndW1lbnQgKi8KKwlpZihoeCA+PSAweDQxOTViODQ0KSB7CQkJLyogaWYgfHh8Pj0yNypsbjIgKi8KKwkgICAgaWYoaHggPj0gMHg0MmIxNzIxOCkgewkJLyogaWYgfHh8Pj04OC43MjEuLi4gKi8KKyAgICAgICAgICAgICAgICBpZihoeD4weDdmODAwMDAwKQorCQkgICAgcmV0dXJuIHgreDsgCSAvKiBOYU4gKi8KKwkJaWYoaHg9PTB4N2Y4MDAwMDApCisJCSAgICByZXR1cm4gKHhzYj09MCk/IHg6LTEuMDsvKiBleHAoKy1pbmYpPXtpbmYsLTF9ICovCisJICAgICAgICBpZih4ID4gb190aHJlc2hvbGQpIHJldHVybiBodWdlKmh1Z2U7IC8qIG92ZXJmbG93ICovCisJICAgIH0KKwkgICAgaWYoeHNiIT0wKSB7IC8qIHggPCAtMjcqbG4yLCByZXR1cm4gLTEuMCB3aXRoIGluZXhhY3QgKi8KKwkJaWYoeCt0aW55PChmbG9hdCkwLjApCS8qIHJhaXNlIGluZXhhY3QgKi8KKwkJcmV0dXJuIHRpbnktb25lOwkvKiByZXR1cm4gLTEgKi8KKwkgICAgfQorCX0KKworICAgIC8qIGFyZ3VtZW50IHJlZHVjdGlvbiAqLworCWlmKGh4ID4gMHgzZWIxNzIxOCkgewkJLyogaWYgIHx4fCA+IDAuNSBsbjIgKi8KKwkgICAgaWYoaHggPCAweDNGODUxNTkyKSB7CS8qIGFuZCB8eHwgPCAxLjUgbG4yICovCisJCWlmKHhzYj09MCkKKwkJICAgIHtoaSA9IHggLSBsbjJfaGk7IGxvID0gIGxuMl9sbzsgIGsgPSAgMTt9CisJCWVsc2UKKwkJICAgIHtoaSA9IHggKyBsbjJfaGk7IGxvID0gLWxuMl9sbzsgIGsgPSAtMTt9CisJICAgIH0gZWxzZSB7CisJCWsgID0gaW52bG4yKngrKCh4c2I9PTApPyhmbG9hdCkwLjU6KGZsb2F0KS0wLjUpOworCQl0ICA9IGs7CisJCWhpID0geCAtIHQqbG4yX2hpOwkvKiB0KmxuMl9oaSBpcyBleGFjdCBoZXJlICovCisJCWxvID0gdCpsbjJfbG87CisJICAgIH0KKwkgICAgeCAgPSBoaSAtIGxvOworCSAgICBjICA9IChoaS14KS1sbzsKKwl9CisJZWxzZSBpZihoeCA8IDB4MzMwMDAwMDApIHsgIAkvKiB3aGVuIHx4fDwyKiotMjUsIHJldHVybiB4ICovCisJICAgIHQgPSBodWdlK3g7CS8qIHJldHVybiB4IHdpdGggaW5leGFjdCBmbGFncyB3aGVuIHghPTAgKi8KKwkgICAgcmV0dXJuIHggLSAodC0oaHVnZSt4KSk7CisJfQorCWVsc2UgayA9IDA7CisKKyAgICAvKiB4IGlzIG5vdyBpbiBwcmltYXJ5IHJhbmdlICovCisJaGZ4ID0gKGZsb2F0KTAuNSp4OworCWh4cyA9IHgqaGZ4OworCXIxID0gb25lK2h4cyooUTEraHhzKihRMitoeHMqKFEzK2h4cyooUTQraHhzKlE1KSkpKTsKKwl0ICA9IChmbG9hdCkzLjAtcjEqaGZ4OworCWUgID0gaHhzKigocjEtdCkvKChmbG9hdCk2LjAgLSB4KnQpKTsKKwlpZihrPT0wKSByZXR1cm4geCAtICh4KmUtaHhzKTsJCS8qIGMgaXMgMCAqLworCWVsc2UgeworCSAgICBlICA9ICh4KihlLWMpLWMpOworCSAgICBlIC09IGh4czsKKwkgICAgaWYoaz09IC0xKSByZXR1cm4gKGZsb2F0KTAuNSooeC1lKS0oZmxvYXQpMC41OworCSAgICBpZihrPT0xKQorCSAgICAgICAJaWYoeCA8IChmbG9hdCktMC4yNSkgcmV0dXJuIC0oZmxvYXQpMi4wKihlLSh4KyhmbG9hdCkwLjUpKTsKKwkgICAgICAgCWVsc2UgCSAgICAgIHJldHVybiAgb25lKyhmbG9hdCkyLjAqKHgtZSk7CisJICAgIGlmIChrIDw9IC0yIHx8IGs+NTYpIHsgICAvKiBzdWZmaWNlIHRvIHJldHVybiBleHAoeCktMSAqLworCSAgICAgICAgaW50MzJfdCBpOworCSAgICAgICAgeSA9IG9uZS0oZS14KTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgICAgIHJldHVybiB5LW9uZTsKKwkgICAgfQorCSAgICB0ID0gb25lOworCSAgICBpZihrPDIzKSB7CisJICAgICAgICBpbnQzMl90IGk7CisJICAgICAgICBTRVRfRkxPQVRfV09SRCh0LDB4M2Y4MDAwMDAgLSAoMHgxMDAwMDAwPj5rKSk7IC8qIHQ9MS0yXi1rICovCisJICAgICAgIAl5ID0gdC0oZS14KTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICB9IGVsc2UgeworCSAgICAgICAgaW50MzJfdCBpOworCQlTRVRfRkxPQVRfV09SRCh0LCgoMHg3Zi1rKTw8MjMpKTsJLyogMl4tayAqLworCSAgICAgICAJeSA9IHgtKGUrdCk7CisJICAgICAgIAl5ICs9IG9uZTsKKwkJR0VUX0ZMT0FUX1dPUkQoaSx5KTsKKwkJU0VUX0ZMT0FUX1dPUkQoeSxpKyhrPDwyMykpOwkvKiBhZGQgayB0byB5J3MgZXhwb25lbnQgKi8KKwkgICAgfQorCX0KKwlyZXR1cm4geTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmFicy5jIGIvbGlibS9zcmMvc19mYWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmFicy5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEAoIylzX2ZhYnMuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmFicy5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmFicyh4KSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB4LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorZmFicyhkb3VibGUgeCkKK3sKKwl1X2ludDMyX3QgaGlnaDsKKwlHRVRfSElHSF9XT1JEKGhpZ2gseCk7CisJU0VUX0hJR0hfV09SRCh4LGhpZ2gmMHg3ZmZmZmZmZik7CisgICAgICAgIHJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mYWJzZi5jIGIvbGlibS9zcmMvc19mYWJzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDA3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZhYnNmLmMKQEAgLTAsMCArMSwzNCBAQAorLyogc19mYWJzZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19mYWJzLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZhYnNmLmMsdiAxLjcgMjAwMi8wNS8yOCAxODoxNTowNCBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmYWJzZih4KSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB4LgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitmYWJzZihmbG9hdCB4KQoreworCXVfaW50MzJfdCBpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwlTRVRfRkxPQVRfV09SRCh4LGl4JjB4N2ZmZmZmZmYpOworICAgICAgICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmFic2wuYyBiL2xpYm0vc3JjL3NfZmFic2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mYWJzbC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzIERhZy1FcmxpbmcgQ2/vZGFuIFNt+HJncmF2CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgaW4gdGhpcyBwb3NpdGlvbiBhbmQgdW5jaGFuZ2VkLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZhYnNsLmMsdiAxLjIgMjAwMy8xMC8yNSAxOTo1MzoyOCBkZXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2xvbmcgZG91YmxlCitmYWJzbChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IHg7CisJdS5iaXRzLnNpZ24gPSAwOworCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmRpbS5jIGIvbGlibS9zcmMvc19mZGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNDdjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZmRpbS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmRpbS5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUJREVDTCh0eXBlLCBmbikJCQlcCit0eXBlCQkJCQlcCitmbih0eXBlIHgsIHR5cGUgeSkJCQlcCit7CQkJCQlcCisJCQkJCVwKKwlpZiAoaXNuYW4oeCkpCQkJXAorCQlyZXR1cm4gKHgpOwkJXAorCWlmIChpc25hbih5KSkJCQlcCisJCXJldHVybiAoeSk7CQlcCisJcmV0dXJuICh4ID4geSA/IHggLSB5IDogMC4wKTsJXAorfQorCitERUNMKGRvdWJsZSwgZmRpbSkKK0RFQ0woZmxvYXQsIGZkaW1mKQorREVDTChsb25nIGRvdWJsZSwgZmRpbWwpCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zpbml0ZS5jIGIvbGlibS9zcmMvc19maW5pdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRkMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19maW5pdGUuYwpAQCAtMCwwICsxLDMwIEBACisvKiBAKCMpc19maW5pdGUuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmluaXRlLmMsdiAxLjggMjAwMy8wNy8yMyAwNDo1Mzo0NiBwZXRlciBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZpbml0ZSh4KSByZXR1cm5zIDEgaXMgeCBpcyBmaW5pdGUsIGVsc2UgMDsKKyAqIG5vIGJyYW5jaGluZyEKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisJaW50IGZpbml0ZShkb3VibGUgeCkKK3sKKwlpbnQzMl90IGh4OworCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJcmV0dXJuIChpbnQpKCh1X2ludDMyX3QpKChoeCYweDdmZmZmZmZmKS0weDdmZjAwMDAwKT4+MzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19maW5pdGVmLmMgYi9saWJtL3NyYy9zX2Zpbml0ZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMwNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19maW5pdGVmLmMKQEAgLTAsMCArMSwzMyBAQAorLyogc19maW5pdGVmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2Zpbml0ZS5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19maW5pdGVmLmMsdiAxLjYgMjAwMi8wNS8yOCAxNzo1MTo0NiBhbGZyZWQgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBmaW5pdGVmKHgpIHJldHVybnMgMSBpcyB4IGlzIGZpbml0ZSwgZWxzZSAwOworICogbm8gYnJhbmNoaW5nIQorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgZmluaXRlZihmbG9hdCB4KQoreworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJcmV0dXJuIChpbnQpKCh1X2ludDMyX3QpKChpeCYweDdmZmZmZmZmKS0weDdmODAwMDAwKT4+MzEpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbG9vci5jIGIvbGlibS9zcmMvc19mbG9vci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzMyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zsb29yLmMKQEAgLTAsMCArMSw3MyBAQAorLyogQCgjKXNfZmxvb3IuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmxvb3IuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ2IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmxvb3IoeCkKKyAqIFJldHVybiB4IHJvdW5kZWQgdG93YXJkIC1pbmYgdG8gaW50ZWdyYWwgdmFsdWUKKyAqIE1ldGhvZDoKKyAqCUJpdCB0d2lkZGxpbmcuCisgKiBFeGNlcHRpb246CisgKglJbmV4YWN0IGZsYWcgcmFpc2VkIGlmIHggbm90IGVxdWFsIHRvIGZsb29yKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2RvdWJsZQorZmxvb3IoZG91YmxlIHgpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaSxqOworCUVYVFJBQ1RfV09SRFMoaTAsaTEseCk7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjApIHsvKiByZXR1cm4gMCpzaWduKHgpIGlmIHx4fDwxICovCisJCSAgICBpZihpMD49MCkge2kwPWkxPTA7fQorCQkgICAgZWxzZSBpZigoKGkwJjB4N2ZmZmZmZmYpfGkxKSE9MCkKKwkJCXsgaTA9MHhiZmYwMDAwMDtpMT0wO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDAwZmZmZmYpPj5qMDsKKwkJaWYoKChpMCZpKXxpMSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjApIHsJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpZihpMDwwKSBpMCArPSAoMHgwMDEwMDAwMCk+PmowOworCQkgICAgaTAgJj0gKH5pKTsgaTE9MDsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmIChqMD41MSkgeworCSAgICBpZihqMD09MHg0MDApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9IGVsc2UgeworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSByZXR1cm4geDsJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICBpZihodWdlK3g+MC4wKSB7IAkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCWlmKGkwPDApIHsKKwkJICAgIGlmKGowPT0yMCkgaTArPTE7CisJCSAgICBlbHNlIHsKKwkJCWogPSBpMSsoMTw8KDUyLWowKSk7CisJCQlpZihqPGkxKSBpMCArPTEgOyAJLyogZ290IGEgY2FycnkgKi8KKwkJCWkxPWo7CisJCSAgICB9CisJCX0KKwkJaTEgJj0gKH5pKTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2Zsb29yZi5jIGIvbGlibS9zcmMvc19mbG9vcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE3MWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbG9vcmYuYwpAQCAtMCwwICsxLDYyIEBACisvKiBzX2Zsb29yZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19mbG9vci5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbG9vcmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIGZsb29yZih4KQorICogUmV0dXJuIHggcm91bmRlZCB0b3dhcmQgLWluZiB0byBpbnRlZ3JhbCB2YWx1ZQorICogTWV0aG9kOgorICoJQml0IHR3aWRkbGluZy4KKyAqIEV4Y2VwdGlvbjoKKyAqCUluZXhhY3QgZmxhZyByYWlzZWQgaWYgeCBub3QgZXF1YWwgdG8gZmxvb3JmKHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBodWdlID0gMS4wZTMwOworCitmbG9hdAorZmxvb3JmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4oZmxvYXQpMC4wKSB7LyogcmV0dXJuIDAqc2lnbih4KSBpZiB8eHw8MSAqLworCQkgICAgaWYoaTA+PTApIHtpMD0wO30KKwkJICAgIGVsc2UgaWYoKGkwJjB4N2ZmZmZmZmYpIT0wKQorCQkJeyBpMD0weGJmODAwMDAwO30KKwkJfQorCSAgICB9IGVsc2UgeworCQlpID0gKDB4MDA3ZmZmZmYpPj5qMDsKKwkJaWYoKGkwJmkpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZihodWdlK3g+KGZsb2F0KTAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGlmKGkwPDApIGkwICs9ICgweDAwODAwMDAwKT4+ajA7CisJCSAgICBpMCAmPSAofmkpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCSAgICBlbHNlIHJldHVybiB4OwkJLyogeCBpcyBpbnRlZ3JhbCAqLworCX0KKwlTRVRfRkxPQVRfV09SRCh4LGkwKTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZmxvb3JsLmMgYi9saWJtL3NyYy9zX2Zsb29ybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2Zsb29ybC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEZyb206IEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZmxvb3JsLmMsdiAxLjQgMjAwNS8wNC8yOCAxOTo0NTo1NSBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZmxvb3JsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAtaW5mIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byBmbG9vcmwoeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZGVmaW5lCUlOQ19NQU5IKHUsIGMpCWRvIHsJCQkJCVwKKwl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmg7CQkJCVwKKwl1LmJpdHMubWFuaCArPSAoYyk7CQkJCQlcCisJaWYgKHUuYml0cy5tYW5oIDwgbykJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCU1BTkhfU0laRQlMREJMX01BTkhfU0laRQorI2RlZmluZQlJTkNfTUFOSCh1LCBjKQlkbyB7CQkJCQlcCisJdWludDY0X3QgbyA9IHUuYml0cy5tYW5oOwkJCQlcCisJdS5iaXRzLm1hbmggKz0gKGMpOwkJCQkJXAorCWlmICh1LmJpdHMubWFuaCA8IG8pIHsJCQkJCVwKKwkJdS5iaXRzLmV4cCsrOwkJCQkJXAorCQl1LmJpdHMubWFuaCB8PSAxbGx1IDw8IChMREJMX01BTkhfU0laRSAtIDEpOwlcCisJfQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBodWdlID0gMS4wZTMwMDsKKworbG9uZyBkb3VibGUKK2Zsb29ybChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdSA9IHsgLmUgPSB4IH07CisJaW50IGUgPSB1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMTsKKworCWlmIChlIDwgTUFOSF9TSVpFIC0gMSkgeworCQlpZiAoZSA8IDApIHsJCQkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQkJaWYgKGh1Z2UgKyB4ID4gMC4wKQorCQkJCWlmICh1LmJpdHMuZXhwID4gMCB8fAorCQkJCSAgICAodS5iaXRzLm1hbmggfCB1LmJpdHMubWFubCkgIT0gMCkKKwkJCQkJdS5lID0gdS5iaXRzLnNpZ24gPyAtMS4wIDogMC4wOworCQl9IGVsc2UgeworCQkJdWludDY0X3QgbSA9ICgoMWxsdSA8PCBNQU5IX1NJWkUpIC0gMSkgPj4gKGUgKyAxKTsKKwkJCWlmICgoKHUuYml0cy5tYW5oICYgbSkgfCB1LmJpdHMubWFubCkgPT0gMCkKKwkJCQlyZXR1cm4gKHgpOwkvKiB4IGlzIGludGVncmFsICovCisJCQlpZiAodS5iaXRzLnNpZ24pIHsKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKwkJCQlpZiAoZSA9PSAwKQorCQkJCQl1LmJpdHMuZXhwKys7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJSU5DX01BTkgodSwgMWxsdSA8PCAoTUFOSF9TSVpFIC0gZSAtIDEpKTsKKwkJCX0KKwkJCWlmIChodWdlICsgeCA+IDAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCQl1LmJpdHMubWFuaCAmPSB+bTsKKwkJCQl1LmJpdHMubWFubCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGUgPCBMREJMX01BTlRfRElHIC0gMSkgeworCQl1aW50NjRfdCBtID0gKHVpbnQ2NF90KS0xID4+ICg2NCAtIExEQkxfTUFOVF9ESUcgKyBlICsgMSk7CisJCWlmICgodS5iaXRzLm1hbmwgJiBtKSA9PSAwKQorCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZiAodS5iaXRzLnNpZ24pIHsKKwkJCWlmIChlID09IE1BTkhfU0laRSAtIDEpCisJCQkJSU5DX01BTkgodSwgMSk7CisJCQllbHNlIHsKKwkJCQl1aW50NjRfdCBvID0gdS5iaXRzLm1hbmw7CisJCQkJdS5iaXRzLm1hbmwgKz0gMWxsdSA8PCAoTERCTF9NQU5UX0RJRyAtIGUgLSAxKTsKKwkJCQlpZiAodS5iaXRzLm1hbmwgPCBvKQkvKiBnb3QgYSBjYXJyeSAqLworCQkJCQlJTkNfTUFOSCh1LCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYS5jIGIvbGlibS9zcmMvc19mbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNjMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWEuYwpAQCAtMCwwICsxLDIwMiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWEuYyx2IDEuNCAyMDA1LzAzLzE4IDAyOjI3OjU5IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIFdlIHVzZSBzY2FsaW5nIHRvIGF2b2lkIG92ZXJmbG93L3VuZGVyZmxvdywgYWxvbmcgd2l0aCB0aGUKKyAqIGNhbm9uaWNhbCBwcmVjaXNpb24tZG91YmxpbmcgdGVjaG5pcXVlIGFkYXB0ZWQgZnJvbToKKyAqCisgKglEZWtrZXIsIFQuICBBIEZsb2F0aW5nLVBvaW50IFRlY2huaXF1ZSBmb3IgRXh0ZW5kaW5nIHRoZQorICoJQXZhaWxhYmxlIFByZWNpc2lvbi4gIE51bWVyLiBNYXRoLiAxOCwgMjI0LTI0MiAoMTk3MSkuCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgc2Vuc2l0aXZlIHRvIHRoZSByb3VuZGluZyBwcmVjaXNpb24uICBGUFVzIHN1Y2gKKyAqIGFzIHRoZSBpMzg3IG11c3QgYmUgc2V0IGluIGRvdWJsZS1wcmVjaXNpb24gbW9kZSBpZiB2YXJpYWJsZXMgYXJlCisgKiB0byBiZSBzdG9yZWQgaW4gRlAgcmVnaXN0ZXJzIGluIG9yZGVyIHRvIGF2b2lkIGluY29ycmVjdCByZXN1bHRzLgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBvbiBGcmVlQlNELCBidXQgbm90IG9uIG1hbnkgb3RoZXIgc3lzdGVtcy4KKyAqCisgKiBIYXJkd2FyZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIHVzZWQgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgaXQsCisgKiBzaW5jZSB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IGJlIHNldmVyYWwgdGltZXMgc2xvd2VyLgorICovCisjaWYgTERCTF9NQU5UX0RJRyAhPSAxMTMKK2RvdWJsZQorZm1hKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopCit7CisJc3RhdGljIGNvbnN0IGRvdWJsZSBzcGxpdCA9IDB4MXAyNyArIDEuMDsKKwlkb3VibGUgeHMsIHlzLCB6czsKKwlkb3VibGUgYywgY2MsIGh4LCBoeSwgcCwgcSwgdHgsIHR5OworCWRvdWJsZSByLCByciwgczsKKwlpbnQgb3JvdW5kOworCWludCBleCwgZXksIGV6OworCWludCBzcHJlYWQ7CisKKwlpZiAoeiA9PSAwLjApCisJCXJldHVybiAoeCAqIHkpOworCWlmICh4ID09IDAuMCB8fCB5ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJLyogUmVzdWx0cyBvZiBmcmV4cCgpIGFyZSB1bmRlZmluZWQgZm9yIHRoZXNlIGNhc2VzLiAqLworCWlmICghaXNmaW5pdGUoeCkgfHwgIWlzZmluaXRlKHkpIHx8ICFpc2Zpbml0ZSh6KSkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJeHMgPSBmcmV4cCh4LCAmZXgpOworCXlzID0gZnJleHAoeSwgJmV5KTsKKwl6cyA9IGZyZXhwKHosICZleik7CisJb3JvdW5kID0gZmVnZXRyb3VuZCgpOworCXNwcmVhZCA9IGV4ICsgZXkgLSBlejsKKworCS8qCisJICogSWYgeCAqIHkgYW5kIHogYXJlIG1hbnkgb3JkZXJzIG9mIG1hZ25pdHVkZSBhcGFydCwgdGhlIHNjYWxpbmcKKwkgKiB3aWxsIG92ZXJmbG93LCBzbyB3ZSBoYW5kbGUgdGhlc2UgY2FzZXMgc3BlY2lhbGx5LiAgUm91bmRpbmcKKwkgKiBtb2RlcyBvdGhlciB0aGFuIEZFX1RPTkVBUkVTVCBhcmUgcGFpbmZ1bC4KKwkgKi8KKwlpZiAoc3ByZWFkID4gREJMX01BTlRfRElHICogMikgeworCQlmZW52X3QgZW52OworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlzd2l0Y2gob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh4ICogeSk7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIDApOworCQkJZmV1cGRhdGVlbnYoJmVudik7CisJCQlyZXR1cm4gKHIpOworCQljYXNlIEZFX0RPV05XQVJEOgorCQkJaWYgKHogPiAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIC1JTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVyKHIsIElORklOSVRZKTsKKwkJCWZldXBkYXRlZW52KCZlbnYpOworCQkJcmV0dXJuIChyKTsKKwkJfQorCX0KKwlpZiAoc3ByZWFkIDwgLURCTF9NQU5UX0RJRykgeworCQlmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworCQlpZiAoIWlzbm9ybWFsKHopKQorCQkJZmVyYWlzZWV4Y2VwdChGRV9VTkRFUkZMT1cpOworCQlzd2l0Y2ggKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeik7CisJCWNhc2UgRkVfVE9XQVJEWkVSTzoKKwkJCWlmICh4ID4gMC4wIF4geSA8IDAuMCBeIHogPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcih6LCAwKSk7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcih6LCAtSU5GSU5JVFkpKTsKKwkJZGVmYXVsdDoJLyogRkVfVVBXQVJEICovCisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuIChuZXh0YWZ0ZXIoeiwgSU5GSU5JVFkpKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHopOworCQl9CisJfQorCisJLyoKKwkgKiBVc2UgRGVra2VyJ3MgYWxnb3JpdGhtIHRvIHBlcmZvcm0gdGhlIG11bHRpcGxpY2F0aW9uIGFuZAorCSAqIHN1YnNlcXVlbnQgYWRkaXRpb24gaW4gdHdpY2UgdGhlIG1hY2hpbmUgcHJlY2lzaW9uLgorCSAqIEFycmFuZ2Ugc28gdGhhdCB4ICogeSA9IGMgKyBjYywgYW5kIHggKiB5ICsgeiA9IHIgKyByci4KKwkgKi8KKwlmZXNldHJvdW5kKEZFX1RPTkVBUkVTVCk7CisKKwlwID0geHMgKiBzcGxpdDsKKwloeCA9IHhzIC0gcDsKKwloeCArPSBwOworCXR4ID0geHMgLSBoeDsKKworCXAgPSB5cyAqIHNwbGl0OworCWh5ID0geXMgLSBwOworCWh5ICs9IHA7CisJdHkgPSB5cyAtIGh5OworCisJcCA9IGh4ICogaHk7CisJcSA9IGh4ICogdHkgKyB0eCAqIGh5OworCWMgPSBwICsgcTsKKwljYyA9IHAgLSBjICsgcSArIHR4ICogdHk7CisKKwl6cyA9IGxkZXhwKHpzLCAtc3ByZWFkKTsKKwlyID0gYyArIHpzOworCXMgPSByIC0gYzsKKwlyciA9IChjIC0gKHIgLSBzKSkgKyAoenMgLSBzKSArIGNjOworCisJc3ByZWFkID0gZXggKyBleTsKKwlpZiAoc3ByZWFkICsgaWxvZ2IocikgPiAtMTAyMykgeworCQlmZXNldHJvdW5kKG9yb3VuZCk7CisJCXIgPSByICsgcnI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHJlc3VsdCBpcyBzdWJub3JtYWwsIHNvIHdlIHJvdW5kIGJlZm9yZSBzY2FsaW5nIHRvCisJCSAqIGF2b2lkIGRvdWJsZSByb3VuZGluZy4KKwkJICovCisJCXAgPSBsZGV4cChjb3B5c2lnbigweDFwLTEwMjIsIHIpLCAtc3ByZWFkKTsKKwkJYyA9IHIgKyBwOworCQlzID0gYyAtIHI7CisJCWNjID0gKHIgLSAoYyAtIHMpKSArIChwIC0gcykgKyBycjsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gKGMgKyBjYykgLSBwOworCX0KKwlyZXR1cm4gKGxkZXhwKHIsIHNwcmVhZCkpOworfQorI2Vsc2UJLyogTERCTF9NQU5UX0RJRyA9PSAxMTMgKi8KKy8qCisgKiAxMTMgYml0cyBvZiBwcmVjaXNpb24gaXMgbW9yZSB0aGFuIHR3aWNlIHRoZSBwcmVjaXNpb24gb2YgYSBkb3VibGUsCisgKiBzbyBpdCBpcyBlbm91Z2ggdG8gcmVwcmVzZW50IHRoZSBpbnRlcm1lZGlhdGUgcHJvZHVjdCBleGFjdGx5LgorICovCitkb3VibGUKK2ZtYShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KQoreworCXJldHVybiAoKGxvbmcgZG91YmxlKXggKiB5ICsgeik7Cit9CisjZW5kaWYJLyogTERCTF9NQU5UX0RJRyAhPSAxMTMgKi8KKworI2lmIChMREJMX01BTlRfRElHID09IDUzKQorX193ZWFrX3JlZmVyZW5jZShmbWEsIGZtYWwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZtYWYuYyBiL2xpYm0vc3JjL3NfZm1hZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYWYuYwpAQCAtMCwwICsxLDQ3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYWYuYyx2IDEuMSAyMDA1LzAxLzIyIDA5OjUzOjE4IGRhcyBFeHAgJCIpOyAqLworCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIEEgZG91YmxlIGhhcyBtb3JlIHRoYW4gdHdpY2UgYXMgbXVjaCBwcmVjaXNpb24gdGhhbiBhIGZsb2F0LCBzbworICogZGlyZWN0IGRvdWJsZS1wcmVjaXNpb24gYXJpdGhtZXRpYyBzdWZmaWNlcy4KKyAqCisgKiBYWFggV2UgYXJlIHJlbHlpbmcgb24gdGhlIGNvbXBpbGVyIHRvIGNvbnZlcnQgZnJvbSBkb3VibGUgdG8gZmxvYXQKKyAqICAgICB1c2luZyB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlIGFuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICogICAgIHNpZGUtZWZmZWN0cy4gIEJ1dCBvbiBhdCBsZWFzdCBvbmUgcGxhdGZvcm0gKGdjYyAzLjQuMi9zcGFyYzY0KSwKKyAqICAgICB0aGlzIGFwcGVhcnMgdG8gYmUgdG9vIG11Y2ggdG8gYXNrIGZvci4gIFRoZSBwcmVjaXNpb24KKyAqICAgICByZWR1Y3Rpb24gc2hvdWxkIGJlIGRvbmUgbWFudWFsbHkuCisgKi8KK2Zsb2F0CitmbWFmKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCit7CisKKwlyZXR1cm4gKChkb3VibGUpeCAqIHkgKyB6KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1hbC5jIGIvbGlibS9zcmMvc19mbWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MzZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1hbC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZtYWwuYyx2IDEuMiAyMDA1LzAzLzE4IDAyOjI3OjU5IGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8ZmVudi5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogRnVzZWQgbXVsdGlwbHktYWRkOiBDb21wdXRlIHggKiB5ICsgeiB3aXRoIGEgc2luZ2xlIHJvdW5kaW5nIGVycm9yLgorICoKKyAqIFdlIHVzZSBzY2FsaW5nIHRvIGF2b2lkIG92ZXJmbG93L3VuZGVyZmxvdywgYWxvbmcgd2l0aCB0aGUKKyAqIGNhbm9uaWNhbCBwcmVjaXNpb24tZG91YmxpbmcgdGVjaG5pcXVlIGFkYXB0ZWQgZnJvbToKKyAqCisgKglEZWtrZXIsIFQuICBBIEZsb2F0aW5nLVBvaW50IFRlY2huaXF1ZSBmb3IgRXh0ZW5kaW5nIHRoZQorICoJQXZhaWxhYmxlIFByZWNpc2lvbi4gIE51bWVyLiBNYXRoLiAxOCwgMjI0LTI0MiAoMTk3MSkuCisgKi8KK2xvbmcgZG91YmxlCitmbWFsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHksIGxvbmcgZG91YmxlIHopCit7CisjaWYgTERCTF9NQU5UX0RJRyA9PSA2NAorCXN0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBzcGxpdCA9IDB4MXAzMkwgKyAxLjA7CisjZWxpZiBMREJMX01BTlRfRElHID09IDExMworCXN0YXRpYyBjb25zdCBsb25nIGRvdWJsZSBzcGxpdCA9IDB4MXA1N0wgKyAxLjA7CisjZW5kaWYKKwlsb25nIGRvdWJsZSB4cywgeXMsIHpzOworCWxvbmcgZG91YmxlIGMsIGNjLCBoeCwgaHksIHAsIHEsIHR4LCB0eTsKKwlsb25nIGRvdWJsZSByLCByciwgczsKKwlpbnQgb3JvdW5kOworCWludCBleCwgZXksIGV6OworCWludCBzcHJlYWQ7CisKKwlpZiAoeiA9PSAwLjApCisJCXJldHVybiAoeCAqIHkpOworCWlmICh4ID09IDAuMCB8fCB5ID09IDAuMCkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJLyogUmVzdWx0cyBvZiBmcmV4cCgpIGFyZSB1bmRlZmluZWQgZm9yIHRoZXNlIGNhc2VzLiAqLworCWlmICghaXNmaW5pdGUoeCkgfHwgIWlzZmluaXRlKHkpIHx8ICFpc2Zpbml0ZSh6KSkKKwkJcmV0dXJuICh4ICogeSArIHopOworCisJeHMgPSBmcmV4cGwoeCwgJmV4KTsKKwl5cyA9IGZyZXhwbCh5LCAmZXkpOworCXpzID0gZnJleHBsKHosICZleik7CisJb3JvdW5kID0gZmVnZXRyb3VuZCgpOworCXNwcmVhZCA9IGV4ICsgZXkgLSBlejsKKworCS8qCisJICogSWYgeCAqIHkgYW5kIHogYXJlIG1hbnkgb3JkZXJzIG9mIG1hZ25pdHVkZSBhcGFydCwgdGhlIHNjYWxpbmcKKwkgKiB3aWxsIG92ZXJmbG93LCBzbyB3ZSBoYW5kbGUgdGhlc2UgY2FzZXMgc3BlY2lhbGx5LiAgUm91bmRpbmcKKwkgKiBtb2RlcyBvdGhlciB0aGFuIEZFX1RPTkVBUkVTVCBhcmUgcGFpbmZ1bC4KKwkgKi8KKwlpZiAoc3ByZWFkID4gTERCTF9NQU5UX0RJRyAqIDIpIHsKKwkJZmVudl90IGVudjsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsKKwkJc3dpdGNoKG9yb3VuZCkgeworCQljYXNlIEZFX1RPTkVBUkVTVDoKKwkJCXJldHVybiAoeCAqIHkpOworCQljYXNlIEZFX1RPV0FSRFpFUk86CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjAgXiB6IDwgMC4wKQorCQkJCXJldHVybiAoeCAqIHkpOworCQkJZmVob2xkZXhjZXB0KCZlbnYpOworCQkJciA9IHggKiB5OworCQkJaWYgKCFmZXRlc3RleGNlcHQoRkVfSU5FWEFDVCkpCisJCQkJciA9IG5leHRhZnRlcmwociwgMCk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeiA+IDAuMCkKKwkJCQlyZXR1cm4gKHggKiB5KTsKKwkJCWZlaG9sZGV4Y2VwdCgmZW52KTsKKwkJCXIgPSB4ICogeTsKKwkJCWlmICghZmV0ZXN0ZXhjZXB0KEZFX0lORVhBQ1QpKQorCQkJCXIgPSBuZXh0YWZ0ZXJsKHIsIC1JTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHogPCAwLjApCisJCQkJcmV0dXJuICh4ICogeSk7CisJCQlmZWhvbGRleGNlcHQoJmVudik7CisJCQlyID0geCAqIHk7CisJCQlpZiAoIWZldGVzdGV4Y2VwdChGRV9JTkVYQUNUKSkKKwkJCQlyID0gbmV4dGFmdGVybChyLCBJTkZJTklUWSk7CisJCQlmZXVwZGF0ZWVudigmZW52KTsKKwkJCXJldHVybiAocik7CisJCX0KKwl9CisJaWYgKHNwcmVhZCA8IC1MREJMX01BTlRfRElHKSB7CisJCWZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7CisJCWlmICghaXNub3JtYWwoeikpCisJCQlmZXJhaXNlZXhjZXB0KEZFX1VOREVSRkxPVyk7CisJCXN3aXRjaCAob3JvdW5kKSB7CisJCWNhc2UgRkVfVE9ORUFSRVNUOgorCQkJcmV0dXJuICh6KTsKKwkJY2FzZSBGRV9UT1dBUkRaRVJPOgorCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wIF4geiA8IDAuMCkKKwkJCQlyZXR1cm4gKHopOworCQkJZWxzZQorCQkJCXJldHVybiAobmV4dGFmdGVybCh6LCAwKSk7CisJCWNhc2UgRkVfRE9XTldBUkQ6CisJCQlpZiAoeCA+IDAuMCBeIHkgPCAwLjApCisJCQkJcmV0dXJuICh6KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKG5leHRhZnRlcmwoeiwgLUlORklOSVRZKSk7CisJCWRlZmF1bHQ6CS8qIEZFX1VQV0FSRCAqLworCQkJaWYgKHggPiAwLjAgXiB5IDwgMC4wKQorCQkJCXJldHVybiAobmV4dGFmdGVybCh6LCBJTkZJTklUWSkpOworCQkJZWxzZQorCQkJCXJldHVybiAoeik7CisJCX0KKwl9CisKKwkvKgorCSAqIFVzZSBEZWtrZXIncyBhbGdvcml0aG0gdG8gcGVyZm9ybSB0aGUgbXVsdGlwbGljYXRpb24gYW5kCisJICogc3Vic2VxdWVudCBhZGRpdGlvbiBpbiB0d2ljZSB0aGUgbWFjaGluZSBwcmVjaXNpb24uCisJICogQXJyYW5nZSBzbyB0aGF0IHggKiB5ID0gYyArIGNjLCBhbmQgeCAqIHkgKyB6ID0gciArIHJyLgorCSAqLworCWZlc2V0cm91bmQoRkVfVE9ORUFSRVNUKTsKKworCXAgPSB4cyAqIHNwbGl0OworCWh4ID0geHMgLSBwOworCWh4ICs9IHA7CisJdHggPSB4cyAtIGh4OworCisJcCA9IHlzICogc3BsaXQ7CisJaHkgPSB5cyAtIHA7CisJaHkgKz0gcDsKKwl0eSA9IHlzIC0gaHk7CisKKwlwID0gaHggKiBoeTsKKwlxID0gaHggKiB0eSArIHR4ICogaHk7CisJYyA9IHAgKyBxOworCWNjID0gcCAtIGMgKyBxICsgdHggKiB0eTsKKworCXpzID0gbGRleHBsKHpzLCAtc3ByZWFkKTsKKwlyID0gYyArIHpzOworCXMgPSByIC0gYzsKKwlyciA9IChjIC0gKHIgLSBzKSkgKyAoenMgLSBzKSArIGNjOworCisJc3ByZWFkID0gZXggKyBleTsKKwlpZiAoc3ByZWFkICsgaWxvZ2JsKHIpID4gLTE2MzgzKSB7CisJCWZlc2V0cm91bmQob3JvdW5kKTsKKwkJciA9IHIgKyBycjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcmVzdWx0IGlzIHN1Ym5vcm1hbCwgc28gd2Ugcm91bmQgYmVmb3JlIHNjYWxpbmcgdG8KKwkJICogYXZvaWQgZG91YmxlIHJvdW5kaW5nLgorCQkgKi8KKwkJcCA9IGxkZXhwbChjb3B5c2lnbmwoMHgxcC0xNjM4MkwsIHIpLCAtc3ByZWFkKTsKKwkJYyA9IHIgKyBwOworCQlzID0gYyAtIHI7CisJCWNjID0gKHIgLSAoYyAtIHMpKSArIChwIC0gcykgKyBycjsKKwkJZmVzZXRyb3VuZChvcm91bmQpOworCQlyID0gKGMgKyBjYykgLSBwOworCX0KKwlyZXR1cm4gKGxkZXhwbChyLCBzcHJlYWQpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1heC5jIGIvbGlibS9zcmMvc19mbWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1heC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1heC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZG91YmxlCitmbWF4KGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHVbMl07CisKKwl1WzBdLmQgPSB4OworCXVbMV0uZCA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjA0NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVswXS5iaXRzLnNpZ25dLmQpOworCisJcmV0dXJuICh4ID4geSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1heGYuYyBiL2xpYm0vc3JjL3NfZm1heGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdmNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWF4Zi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1heGYuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2Zsb2F0CitmbWF4ZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVuaW9uIElFRUVmMmJpdHMgdVsyXTsKKworCXVbMF0uZiA9IHg7CisJdVsxXS5mID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVswXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDI1NSAmJiB1WzFdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzBdLmJpdHMuc2lnbl0uZik7CisKKwlyZXR1cm4gKHggPiB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWF4bC5jIGIvbGlibS9zcmMvc19mbWF4bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTlkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtYXhsLmMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWF4bC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2ZtYXhsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1WzJdOworCisJdVswXS5lID0geDsKKwltYXNrX25iaXRfbCh1WzBdKTsKKwl1WzFdLmUgPSB5OworCW1hc2tfbmJpdF9sKHVbMV0pOworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbMF0uYml0cy5zaWduID8geSA6IHgpOworCisJcmV0dXJuICh4ID4geSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1pbi5jIGIvbGlibS9zcmMvc19mbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliOWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfZm1pbi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1pbi5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworZG91YmxlCitmbWluKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFZDJiaXRzIHVbMl07CisKKwl1WzBdLmQgPSB4OworCXVbMV0uZCA9IHk7CisKKwkvKiBDaGVjayBmb3IgTmFOcyB0byBhdm9pZCByYWlzaW5nIHNwdXJpb3VzIGV4Y2VwdGlvbnMuICovCisJaWYgKHVbMF0uYml0cy5leHAgPT0gMjA0NyAmJiAodVswXS5iaXRzLm1hbmggfCB1WzBdLmJpdHMubWFubCkgIT0gMCkKKwkJcmV0dXJuICh5KTsKKwlpZiAodVsxXS5iaXRzLmV4cCA9PSAyMDQ3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbdVsxXS5iaXRzLnNpZ25dLmQpOworCisJcmV0dXJuICh4IDwgeSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZm1pbmYuYyBiL2xpYm0vc3JjL3NfZm1pbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmZiNTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mbWluZi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfZm1pbmYuYyx2IDEuMSAyMDA0LzA2LzMwIDA3OjA0OjAxIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2Zsb2F0CitmbWluZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXVuaW9uIElFRUVmMmJpdHMgdVsyXTsKKworCXVbMF0uZiA9IHg7CisJdVsxXS5mID0geTsKKworCS8qIENoZWNrIGZvciBOYU5zIHRvIGF2b2lkIHJhaXNpbmcgc3B1cmlvdXMgZXhjZXB0aW9ucy4gKi8KKwlpZiAodVswXS5iaXRzLmV4cCA9PSAyNTUgJiYgdVswXS5iaXRzLm1hbiAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDI1NSAmJiB1WzFdLmJpdHMubWFuICE9IDApCisJCXJldHVybiAoeCk7CisKKwkvKiBIYW5kbGUgY29tcGFyaXNvbnMgb2Ygc2lnbmVkIHplcm9lcy4gKi8KKwlpZiAodVswXS5iaXRzLnNpZ24gIT0gdVsxXS5iaXRzLnNpZ24pCisJCXJldHVybiAodVt1WzFdLmJpdHMuc2lnbl0uZik7CisKKwlyZXR1cm4gKHggPCB5ID8geCA6IHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19mbWlubC5jIGIvbGlibS9zcmMvc19mbWlubC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOGM1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZtaW5sLmMKQEAgLTAsMCArMSw1NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2NodWx0eiA8ZGFzQEZyZWVCU0QuT1JHPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mbWlubC5jLHYgMS4xIDIwMDQvMDYvMzAgMDc6MDQ6MDEgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworbG9uZyBkb3VibGUKK2ZtaW5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpCit7CisJdW5pb24gSUVFRWwyYml0cyB1WzJdOworCisJdVswXS5lID0geDsKKwltYXNrX25iaXRfbCh1WzBdKTsKKwl1WzFdLmUgPSB5OworCW1hc2tfbmJpdF9sKHVbMV0pOworCisJLyogQ2hlY2sgZm9yIE5hTnMgdG8gYXZvaWQgcmFpc2luZyBzcHVyaW91cyBleGNlcHRpb25zLiAqLworCWlmICh1WzBdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzBdLmJpdHMubWFuaCB8IHVbMF0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHkpOworCWlmICh1WzFdLmJpdHMuZXhwID09IDMyNzY3ICYmICh1WzFdLmJpdHMubWFuaCB8IHVbMV0uYml0cy5tYW5sKSAhPSAwKQorCQlyZXR1cm4gKHgpOworCisJLyogSGFuZGxlIGNvbXBhcmlzb25zIG9mIHNpZ25lZCB6ZXJvZXMuICovCisJaWYgKHVbMF0uYml0cy5zaWduICE9IHVbMV0uYml0cy5zaWduKQorCQlyZXR1cm4gKHVbMV0uYml0cy5zaWduID8geSA6IHgpOworCisJcmV0dXJuICh4IDwgeSA/IHggOiB5KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZnJleHAuYyBiL2xpYm0vc3JjL3NfZnJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODllMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mcmV4cC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIEAoIylzX2ZyZXhwLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZyZXhwLmMsdiAxLjEwIDIwMDUvMDMvMDcgMjE6Mjc6MzcgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogZm9yIG5vbi16ZXJvIHgKKyAqCXggPSBmcmV4cChhcmcsJmV4cCk7CisgKiByZXR1cm4gYSBkb3VibGUgZnAgcXVhbnRpdHkgeCBzdWNoIHRoYXQgMC41IDw9IHx4fCA8MS4wCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmluYXJ5IGV4cG9uZW50ICJleHAiLiBUaGF0IGlzCisgKglhcmcgPSB4KjJeZXhwLgorICogSWYgYXJnIGlzIGluZiwgMC4wLCBvciBOYU4sIHRoZW4gZnJleHAoYXJnLCZleHApIHJldHVybnMgYXJnCisgKiB3aXRoICpleHA9MC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgPSAgMS44MDE0Mzk4NTA5NDgxOTg0MDAwMGUrMTY7IC8qIDB4NDM1MDAwMDAsIDB4MDAwMDAwMDAgKi8KKworZG91YmxlCitmcmV4cChkb3VibGUgeCwgaW50ICplcHRyKQoreworCWludDMyX3QgaHgsIGl4LCBseDsKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCWl4ID0gMHg3ZmZmZmZmZiZoeDsKKwkqZXB0ciA9IDA7CisJaWYoaXg+PTB4N2ZmMDAwMDB8fCgoaXh8bHgpPT0wKSkgcmV0dXJuIHg7CS8qIDAsaW5mLG5hbiAqLworCWlmIChpeDwweDAwMTAwMDAwKSB7CQkvKiBzdWJub3JtYWwgKi8KKwkgICAgeCAqPSB0d281NDsKKwkgICAgR0VUX0hJR0hfV09SRChoeCx4KTsKKwkgICAgaXggPSBoeCYweDdmZmZmZmZmOworCSAgICAqZXB0ciA9IC01NDsKKwl9CisJKmVwdHIgKz0gKGl4Pj4yMCktMTAyMjsKKwloeCA9IChoeCYweDgwMGZmZmZmKXwweDNmZTAwMDAwOworCVNFVF9ISUdIX1dPUkQoeCxoeCk7CisJcmV0dXJuIHg7Cit9CisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykKK19fd2Vha19yZWZlcmVuY2UoZnJleHAsIGZyZXhwbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfZnJleHBmLmMgYi9saWJtL3NyYy9zX2ZyZXhwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDQ2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2ZyZXhwZi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHNfZnJleHBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2ZyZXhwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2ZyZXhwZi5jLHYgMS44IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK3R3bzI1ID0gIDMuMzU1NDQzMjAwMGUrMDc7IC8qIDB4NGMwMDAwMDAgKi8KKworZmxvYXQKK2ZyZXhwZihmbG9hdCB4LCBpbnQgKmVwdHIpCit7CisJaW50MzJfdCBoeCxpeDsKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlpeCA9IDB4N2ZmZmZmZmYmaHg7CisJKmVwdHIgPSAwOworCWlmKGl4Pj0weDdmODAwMDAwfHwoaXg9PTApKSByZXR1cm4geDsJLyogMCxpbmYsbmFuICovCisJaWYgKGl4PDB4MDA4MDAwMDApIHsJCS8qIHN1Ym5vcm1hbCAqLworCSAgICB4ICo9IHR3bzI1OworCSAgICBHRVRfRkxPQVRfV09SRChoeCx4KTsKKwkgICAgaXggPSBoeCYweDdmZmZmZmZmOworCSAgICAqZXB0ciA9IC0yNTsKKwl9CisJKmVwdHIgKz0gKGl4Pj4yMyktMTI2OworCWh4ID0gKGh4JjB4ODA3ZmZmZmYpfDB4M2YwMDAwMDA7CisJKihpbnQqKSZ4ID0gaHg7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2ZyZXhwbC5jIGIvbGlibS9zcmMvc19mcmV4cGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGIzMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19mcmV4cGwuYwpAQCAtMCwwICsxLDYyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19mcmV4cGwuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU0OjUxIGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworbG9uZyBkb3VibGUKK2ZyZXhwbChsb25nIGRvdWJsZSB4LCBpbnQgKmV4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IHg7CisJc3dpdGNoICh1LmJpdHMuZXhwKSB7CisJY2FzZSAwOgkJLyogMCBvciBzdWJub3JtYWwgKi8KKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKSB7CisJCQkqZXggPSAwOworCQl9IGVsc2UgeworCQkJdS5lICo9IDB4MS4wcDUxNDsKKwkJCSpleCA9IHUuYml0cy5leHAgLSAweDQyMDA7CisJCQl1LmJpdHMuZXhwID0gMHgzZmZlOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg3ZmZmOgkvKiBpbmZpbml0eSBvciBOYU47IHZhbHVlIG9mICpleCBpcyB1bnNwZWNpZmllZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgkvKiBub3JtYWwgKi8KKwkJKmV4ID0gdS5iaXRzLmV4cCAtIDB4M2ZmZTsKKwkJdS5iaXRzLmV4cCA9IDB4M2ZmZTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAodS5lKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaWxvZ2IuYyBiL2xpYm0vc3JjL3NfaWxvZ2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRhNDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pbG9nYi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEAoIylzX2lsb2diLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2lsb2diLmMsdiAxLjkgMjAwNC8xMC8wOSAxNzoxNDoyOCBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKiBpbG9nYihkb3VibGUgeCkKKyAqIHJldHVybiB0aGUgYmluYXJ5IGV4cG9uZW50IG9mIG5vbi16ZXJvIHgKKyAqIGlsb2diKDApID0gRlBfSUxPR0IwCisgKiBpbG9nYihOYU4pID0gRlBfSUxPR0JOQU4gKG5vIHNpZ25hbCBpcyByYWlzZWQpCisgKiBpbG9nYihpbmYpID0gSU5UX01BWCAobm8gc2lnbmFsIGlzIHJhaXNlZCkKKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgaWxvZ2IoZG91YmxlIHgpCit7CisJaW50MzJfdCBoeCxseCxpeDsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJaHggJj0gMHg3ZmZmZmZmZjsKKwlpZihoeDwweDAwMTAwMDAwKSB7CisJICAgIGlmKChoeHxseCk9PTApCisJCXJldHVybiBGUF9JTE9HQjA7CisJICAgIGVsc2UJCQkvKiBzdWJub3JtYWwgeCAqLworCQlpZihoeD09MCkgeworCQkgICAgZm9yIChpeCA9IC0xMDQzOyBseD4wOyBseDw8PTEpIGl4IC09MTsKKwkJfSBlbHNlIHsKKwkJICAgIGZvciAoaXggPSAtMTAyMixoeDw8PTExOyBoeD4wOyBoeDw8PTEpIGl4IC09MTsKKwkJfQorCSAgICByZXR1cm4gaXg7CisJfQorCWVsc2UgaWYgKGh4PDB4N2ZmMDAwMDApIHJldHVybiAoaHg+PjIwKS0xMDIzOworCWVsc2UgaWYgKGh4PjB4N2ZmMDAwMDAgfHwgbHghPTApIHJldHVybiBGUF9JTE9HQk5BTjsKKwllbHNlIHJldHVybiBJTlRfTUFYOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19pbG9nYmYuYyBiL2xpYm0vc3JjL3NfaWxvZ2JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YzRkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaWxvZ2JmLmMKQEAgLTAsMCArMSw0MSBAQAorLyogc19pbG9nYmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfaWxvZ2IuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaWxvZ2JmLmMsdiAxLjcgMjAwNC8xMC8wOSAxNzoxNDoyOCBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKKwlpbnQgaWxvZ2JmKGZsb2F0IHgpCit7CisJaW50MzJfdCBoeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWh4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaHg8MHgwMDgwMDAwMCkgeworCSAgICBpZihoeD09MCkKKwkJcmV0dXJuIEZQX0lMT0dCMDsKKwkgICAgZWxzZQkJCS8qIHN1Ym5vcm1hbCB4ICovCisJICAgICAgICBmb3IgKGl4ID0gLTEyNixoeDw8PTg7IGh4PjA7IGh4PDw9MSkgaXggLT0xOworCSAgICByZXR1cm4gaXg7CisJfQorCWVsc2UgaWYgKGh4PDB4N2Y4MDAwMDApIHJldHVybiAoaHg+PjIzKS0xMjc7CisJZWxzZSBpZiAoaHg+MHg3ZjgwMDAwMCkgcmV0dXJuIEZQX0lMT0dCTkFOOworCWVsc2UgcmV0dXJuIElOVF9NQVg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lsb2dibC5jIGIvbGlibS9zcmMvc19pbG9nYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZhZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pbG9nYmwuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogRnJvbTogQCgjKXNfaWxvZ2IuYyA1LjEgOTMvMDkvMjQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pbG9nYmwuYyx2IDEuMSAyMDA0LzEwLzExIDE4OjEzOjUyIHN0ZWZhbmYgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCitpbnQKK2lsb2dibChsb25nIGRvdWJsZSB4KQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKwl1bnNpZ25lZCBsb25nIG07CisJaW50IGI7CisKKwl1LmUgPSB4OworCWlmICh1LmJpdHMuZXhwID09IDApIHsKKwkJaWYgKCh1LmJpdHMubWFubCB8IHUuYml0cy5tYW5oKSA9PSAwKQorCQkJcmV0dXJuIChGUF9JTE9HQjApOworCQkvKiBkZW5vcm1hbGl6ZWQgKi8KKwkJaWYgKHUuYml0cy5tYW5oID09IDApIHsKKwkJCW0gPSAxbHUgPDwgKExEQkxfTUFOTF9TSVpFIC0gMSk7CisJCQlmb3IgKGIgPSBMREJMX01BTkhfU0laRTsgISh1LmJpdHMubWFubCAmIG0pOyBtID4+PSAxKQorCQkJCWIrKzsKKwkJfSBlbHNlIHsKKwkJCW0gPSAxbHUgPDwgKExEQkxfTUFOSF9TSVpFIC0gMSk7CisJCQlmb3IgKGIgPSAwOyAhKHUuYml0cy5tYW5oICYgbSk7IG0gPj49IDEpCisJCQkJYisrOworCQl9CisjaWZkZWYgTERCTF9JTVBMSUNJVF9OQklUCisJCWIrKzsKKyNlbmRpZgorCQlyZXR1cm4gKExEQkxfTUlOX0VYUCAtIGIgLSAxKTsKKwl9IGVsc2UgaWYgKHUuYml0cy5leHAgPCAoTERCTF9NQVhfRVhQIDw8IDEpIC0gMSkKKwkJcmV0dXJuICh1LmJpdHMuZXhwIC0gTERCTF9NQVhfRVhQICsgMSk7CisJZWxzZSBpZiAodS5iaXRzLm1hbmwgIT0gMCB8fCB1LmJpdHMubWFuaCAhPSAwKQorCQlyZXR1cm4gKEZQX0lMT0dCTkFOKTsKKwllbHNlCisJCXJldHVybiAoSU5UX01BWCk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lzZmluaXRlLmMgYi9saWJtL3NyYy9zX2lzZmluaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaXNmaW5pdGUuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaXNmaW5pdGUuYyx2IDEuMSAyMDA0LzA3LzA5IDAzOjMyOjM5IGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitfX2lzZmluaXRlKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDIwNDcpOworfQorCitpbnQKK19faXNmaW5pdGVmKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMjU1KTsKK30KKworaW50CitfX2lzZmluaXRlbChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDMyNzY3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfaXNuYW4uYyBiL2xpYm0vc3JjL3NfaXNuYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzYzNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19pc25hbi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNjaHVsdHogPGRhc0BGcmVlQlNELk9SRz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19pc25hbi5jLHYgMS44IDIwMDQvMDgvMDUgMDE6NDY6MTEgZGFzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorCisvKiBQcm92aWRlZCBieSBsaWJjICovCisjaWYgMQoraW50CisoaXNuYW4pKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwID09IDIwNDcgJiYgKHUuYml0cy5tYW5sICE9IDAgfHwgdS5iaXRzLm1hbmggIT0gMCkpOworfQorI2VuZGlmCisKK2ludAoraXNuYW5mKGZsb2F0IGYpCit7CisJdW5pb24gSUVFRWYyYml0cyB1OworCisJdS5mID0gZjsKKwlyZXR1cm4gKHUuYml0cy5leHAgPT0gMjU1ICYmIHUuYml0cy5tYW4gIT0gMCk7Cit9CisKK2ludAorX19pc25hbmwobG9uZyBkb3VibGUgZSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisKKwl1LmUgPSBlOworCW1hc2tfbmJpdF9sKHUpOworCXJldHVybiAodS5iaXRzLmV4cCA9PSAzMjc2NyAmJiAodS5iaXRzLm1hbmwgIT0gMCB8fCB1LmJpdHMubWFuaCAhPSAwKSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2lzbm9ybWFsLmMgYi9saWJtL3NyYy9zX2lzbm9ybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NWRiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfaXNub3JtYWwuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfaXNub3JtYWwuYyx2IDEuMSAyMDA0LzA3LzA5IDAzOjMyOjM5IGRhcyBFeHAgJAorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworaW50CitfX2lzbm9ybWFsKGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDAgJiYgdS5iaXRzLmV4cCAhPSAyMDQ3KTsKK30KKworaW50CitfX2lzbm9ybWFsZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuZXhwICE9IDAgJiYgdS5iaXRzLmV4cCAhPSAyNTUpOworfQorCitpbnQKK19faXNub3JtYWxsKGxvbmcgZG91YmxlIGUpCit7CisJdW5pb24gSUVFRWwyYml0cyB1OworCisJdS5lID0gZTsKKwlyZXR1cm4gKHUuYml0cy5leHAgIT0gMCAmJiB1LmJpdHMuZXhwICE9IDMyNzY3KTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyaW50LmMgYi9saWJtL3NyYy9zX2xscmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjdmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscmludC5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyaW50LmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcmludAorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCWZuCQlsbHJpbnQKKworI2luY2x1ZGUgInNfbHJpbnQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbGxyaW50Zi5jIGIvbGlibS9zcmMvc19sbHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NWUzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyaW50Zi5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyaW50Zi5jLHYgMS4xIDIwMDUvMDEvMTEgMjM6MTI6NTUgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZmxvYXQKKyNkZWZpbmUJcm91bmRpdAkJcmludGYKKyNkZWZpbmUgZHR5cGUJCWxvbmcgbG9uZworI2RlZmluZQlmbgkJbGxyaW50ZgorCisjaW5jbHVkZSAic19scmludC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJvdW5kLmMgYi9saWJtL3NyYy9zX2xscm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sbHJvdW5kLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyb3VuZC5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MjcgZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR0xPTkdfTUFYCisjZGVmaW5lCWZuCQlsbHJvdW5kCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sbHJvdW5kZi5jIGIvbGlibS9zcmMvc19sbHJvdW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xscm91bmRmLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbGxyb3VuZGYuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjI3IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kZgorI2RlZmluZSBkdHlwZQkJbG9uZyBsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdMT05HX01BWAorI2RlZmluZQlmbgkJbGxyb3VuZGYKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xscm91bmRsLmMgYi9saWJtL3NyYy9zX2xscm91bmRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYWU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbGxyb3VuZGwuYwpAQCAtMCwwICsxLDExIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sbHJvdW5kbC5jLHYgMS4xIDIwMDUvMDQvMDggMDE6MjQ6MDggZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJbG9uZyBkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRsCisjZGVmaW5lIGR0eXBlCQlsb25nIGxvbmcKKyNkZWZpbmUJRFRZUEVfTUlOCUxPTkdMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR0xPTkdfTUFYCisjZGVmaW5lCWZuCQlsbHJvdW5kbAorCisjaW5jbHVkZSAic19scm91bmQuYyIKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbG9nMXAuYyBiL2xpYm0vc3JjL3NfbG9nMXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUxNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19sb2cxcC5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiBAKCMpc19sb2cxcC5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19sb2cxcC5jLHYgMS44IDIwMDUvMTIvMDQgMTI6Mjg6MzMgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisvKiBkb3VibGUgbG9nMXAoZG91YmxlIHgpCisgKgorICogTWV0aG9kIDoKKyAqICAgMS4gQXJndW1lbnQgUmVkdWN0aW9uOiBmaW5kIGsgYW5kIGYgc3VjaCB0aGF0CisgKgkJCTEreCA9IDJeayAqICgxK2YpLAorICoJICAgd2hlcmUgIHNxcnQoMikvMiA8IDErZiA8IHNxcnQoMikgLgorICoKKyAqICAgICAgTm90ZS4gSWYgaz0wLCB0aGVuIGY9eCBpcyBleGFjdC4gSG93ZXZlciwgaWYgayE9MCwgdGhlbiBmCisgKgltYXkgbm90IGJlIHJlcHJlc2VudGFibGUgZXhhY3RseS4gSW4gdGhhdCBjYXNlLCBhIGNvcnJlY3Rpb24KKyAqCXRlcm0gaXMgbmVlZC4gTGV0IHU9MSt4IHJvdW5kZWQuIExldCBjID0gKDEreCktdSwgdGhlbgorICoJbG9nKDEreCkgLSBsb2codSkgfiBjL3UuIFRodXMsIHdlIHByb2NlZWQgdG8gY29tcHV0ZSBsb2codSksCisgKglhbmQgYWRkIGJhY2sgdGhlIGNvcnJlY3Rpb24gdGVybSBjL3UuCisgKgkoTm90ZTogd2hlbiB4ID4gMioqNTMsIG9uZSBjYW4gc2ltcGx5IHJldHVybiBsb2coeCkpCisgKgorICogICAyLiBBcHByb3hpbWF0aW9uIG9mIGxvZzFwKGYpLgorICoJTGV0IHMgPSBmLygyK2YpIDsgYmFzZWQgb24gbG9nKDErZikgPSBsb2coMStzKSAtIGxvZygxLXMpCisgKgkJID0gMnMgKyAyLzMgcyoqMyArIDIvNSBzKio1ICsgLi4uLi4sCisgKgkgICAgIAkgPSAycyArIHMqUgorICogICAgICBXZSB1c2UgYSBzcGVjaWFsIFJlbWUgYWxnb3JpdGhtIG9uIFswLDAuMTcxNl0gdG8gZ2VuZXJhdGUKKyAqIAlhIHBvbHlub21pYWwgb2YgZGVncmVlIDE0IHRvIGFwcHJveGltYXRlIFIgVGhlIG1heGltdW0gZXJyb3IKKyAqCW9mIHRoaXMgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIGlzIGJvdW5kZWQgYnkgMioqLTU4LjQ1LiBJbgorICoJb3RoZXIgd29yZHMsCisgKgkJICAgICAgICAyICAgICAgNCAgICAgIDYgICAgICA4ICAgICAgMTAgICAgICAxMiAgICAgIDE0CisgKgkgICAgUih6KSB+IExwMSpzICtMcDIqcyArTHAzKnMgK0xwNCpzICtMcDUqcyAgK0xwNipzICArTHA3KnMKKyAqICAJKHRoZSB2YWx1ZXMgb2YgTHAxIHRvIExwNyBhcmUgbGlzdGVkIGluIHRoZSBwcm9ncmFtKQorICoJYW5kCisgKgkgICAgfCAgICAgIDIgICAgICAgICAgMTQgICAgICAgICAgfCAgICAgLTU4LjQ1CisgKgkgICAgfCBMcDEqcyArLi4uK0xwNypzICAgIC0gIFIoeikgfCA8PSAyCisgKgkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICoJTm90ZSB0aGF0IDJzID0gZiAtIHMqZiA9IGYgLSBoZnNxICsgcypoZnNxLCB3aGVyZSBoZnNxID0gZipmLzIuCisgKglJbiBvcmRlciB0byBndWFyYW50ZWUgZXJyb3IgaW4gbG9nIGJlbG93IDF1bHAsIHdlIGNvbXB1dGUgbG9nCisgKglieQorICoJCWxvZzFwKGYpID0gZiAtIChoZnNxIC0gcyooaGZzcStSKSkuCisgKgorICoJMy4gRmluYWxseSwgbG9nMXAoeCkgPSBrKmxuMiArIGxvZzFwKGYpLgorICoJCSAJICAgICA9IGsqbG4yX2hpKyhmLShoZnNxLShzKihoZnNxK1IpK2sqbG4yX2xvKSkpCisgKgkgICBIZXJlIGxuMiBpcyBzcGxpdCBpbnRvIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXI6CisgKgkJCWxuMl9oaSArIGxuMl9sbywKKyAqCSAgIHdoZXJlIG4qbG4yX2hpIGlzIGFsd2F5cyBleGFjdCBmb3IgfG58IDwgMjAwMC4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJbG9nMXAoeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHggPCAtMSAoaW5jbHVkaW5nIC1JTkYpIDsKKyAqCWxvZzFwKCtJTkYpIGlzICtJTkY7IGxvZzFwKC0xKSBpcyAtSU5GIHdpdGggc2lnbmFsOworICoJbG9nMXAoTmFOKSBpcyB0aGF0IE5hTiB3aXRoIG5vIHNpZ25hbC4KKyAqCisgKiBBY2N1cmFjeToKKyAqCWFjY29yZGluZyB0byBhbiBlcnJvciBhbmFseXNpcywgdGhlIGVycm9yIGlzIGFsd2F5cyBsZXNzIHRoYW4KKyAqCTEgdWxwICh1bml0IGluIHRoZSBsYXN0IHBsYWNlKS4KKyAqCisgKiBDb25zdGFudHM6CisgKiBUaGUgaGV4YWRlY2ltYWwgdmFsdWVzIGFyZSB0aGUgaW50ZW5kZWQgb25lcyBmb3IgdGhlIGZvbGxvd2luZworICogY29uc3RhbnRzLiBUaGUgZGVjaW1hbCB2YWx1ZXMgbWF5IGJlIHVzZWQsIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBjb21waWxlciB3aWxsIGNvbnZlcnQgZnJvbSBkZWNpbWFsIHRvIGJpbmFyeSBhY2N1cmF0ZWx5IGVub3VnaAorICogdG8gcHJvZHVjZSB0aGUgaGV4YWRlY2ltYWwgdmFsdWVzIHNob3duLgorICoKKyAqIE5vdGU6IEFzc3VtaW5nIGxvZygpIHJldHVybiBhY2N1cmF0ZSBhbnN3ZXIsIHRoZSBmb2xsb3dpbmcKKyAqIAkgYWxnb3JpdGhtIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgbG9nMXAoeCkgdG8gd2l0aGluIGEgZmV3IFVMUDoKKyAqCisgKgkJdSA9IDEreDsKKyAqCQlpZih1PT0xLjApIHJldHVybiB4IDsgZWxzZQorICoJCQkgICByZXR1cm4gbG9nKHUpKih4Lyh1LTEuMCkpOworICoKKyAqCSBTZWUgSFAtMTVDIEFkdmFuY2VkIEZ1bmN0aW9ucyBIYW5kYm9vaywgcC4xOTMuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQorbG4yX2hpICA9ICA2LjkzMTQ3MTgwMzY5MTIzODE2NDkwZS0wMSwJLyogM2ZlNjJlNDIgZmVlMDAwMDAgKi8KK2xuMl9sbyAgPSAgMS45MDgyMTQ5MjkyNzA1ODc3MDAwMmUtMTAsCS8qIDNkZWEzOWVmIDM1NzkzYzc2ICovCit0d281NCAgID0gIDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2LCAgLyogNDM1MDAwMDAgMDAwMDAwMDAgKi8KK0xwMSA9IDYuNjY2NjY2NjY2NjY2NzM1MTMwZS0wMSwgIC8qIDNGRTU1NTU1IDU1NTU1NTkzICovCitMcDIgPSAzLjk5OTk5OTk5OTk0MDk0MTkwOGUtMDEsICAvKiAzRkQ5OTk5OSA5OTk3RkEwNCAqLworTHAzID0gMi44NTcxNDI4NzQzNjYyMzkxNDllLTAxLCAgLyogM0ZEMjQ5MjQgOTQyMjkzNTkgKi8KK0xwNCA9IDIuMjIyMjE5ODQzMjE0OTc4Mzk2ZS0wMSwgIC8qIDNGQ0M3MUM1IDFEOEU3OEFGICovCitMcDUgPSAxLjgxODM1NzIxNjE2MTgwNTAxMmUtMDEsICAvKiAzRkM3NDY2NCA5NkNCMDNERSAqLworTHA2ID0gMS41MzEzODM3Njk5MjA5MzczMzJlLTAxLCAgLyogM0ZDMzlBMDkgRDA3OEM2OUYgKi8KK0xwNyA9IDEuNDc5ODE5ODYwNTExNjU4NTkxZS0wMTsgIC8qIDNGQzJGMTEyIERGM0U1MjQ0ICovCisKK3N0YXRpYyBjb25zdCBkb3VibGUgemVybyA9IDAuMDsKKworZG91YmxlCitsb2cxcChkb3VibGUgeCkKK3sKKwlkb3VibGUgaGZzcSxmLGMscyx6LFIsdTsKKwlpbnQzMl90IGssaHgsaHUsYXg7CisKKwlHRVRfSElHSF9XT1JEKGh4LHgpOworCWF4ID0gaHgmMHg3ZmZmZmZmZjsKKworCWsgPSAxOworCWlmIChoeCA8IDB4M0ZEQTgyN0EpIHsJCQkvKiAxK3ggPCBzcXJ0KDIpKyAqLworCSAgICBpZihheD49MHgzZmYwMDAwMCkgewkJLyogeCA8PSAtMS4wICovCisJCWlmKHg9PS0xLjApIHJldHVybiAtdHdvNTQvemVybzsgLyogbG9nMXAoLTEpPStpbmYgKi8KKwkJZWxzZSByZXR1cm4gKHgteCkvKHgteCk7CS8qIGxvZzFwKHg8LTEpPU5hTiAqLworCSAgICB9CisJICAgIGlmKGF4PDB4M2UyMDAwMDApIHsJCQkvKiB8eHwgPCAyKiotMjkgKi8KKwkJaWYodHdvNTQreD56ZXJvCQkJLyogcmFpc2UgaW5leGFjdCAqLworCSAgICAgICAgICAgICYmYXg8MHgzYzkwMDAwMCkgCQkvKiB8eHwgPCAyKiotNTQgKi8KKwkJICAgIHJldHVybiB4OworCQllbHNlCisJCSAgICByZXR1cm4geCAtIHgqeCowLjU7CisJICAgIH0KKwkgICAgaWYoaHg+MHx8aHg8PSgoaW50MzJfdCkweGJmZDJiZWM0KSkgeworCQlrPTA7Zj14O2h1PTE7fQkJLyogc3FydCgyKS8yLSA8PSAxK3ggPCBzcXJ0KDIpKyAqLworCX0KKwlpZiAoaHggPj0gMHg3ZmYwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihrIT0wKSB7CisJICAgIGlmKGh4PDB4NDM0MDAwMDApIHsKKwkJdSAgPSAxLjAreDsKKwkJR0VUX0hJR0hfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMCktMTAyMzsKKwkgICAgICAgIGMgID0gKGs+MCk/IDEuMC0odS14KTp4LSh1LTEuMCk7LyogY29ycmVjdGlvbiB0ZXJtICovCisJCWMgLz0gdTsKKwkgICAgfSBlbHNlIHsKKwkJdSAgPSB4OworCQlHRVRfSElHSF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIwKS0xMDIzOworCQljICA9IDA7CisJICAgIH0KKwkgICAgaHUgJj0gMHgwMDBmZmZmZjsKKwkgICAgLyoKKwkgICAgICogVGhlIGFwcHJveGltYXRpb24gdG8gc3FydCgyKSB1c2VkIGluIHRocmVzaG9sZHMgaXMgbm90CisJICAgICAqIGNyaXRpY2FsLiAgSG93ZXZlciwgdGhlIG9uZXMgdXNlZCBhYm92ZSBtdXN0IGdpdmUgbGVzcworCSAgICAgKiBzdHJpY3QgYm91bmRzIHRoYW4gdGhlIG9uZSBoZXJlIHNvIHRoYXQgdGhlIGs9PTAgY2FzZSBpcworCSAgICAgKiBuZXZlciByZWFjaGVkIGZyb20gaGVyZSwgc2luY2UgaGVyZSB3ZSBoYXZlIGNvbW1pdHRlZCB0bworCSAgICAgKiB1c2luZyB0aGUgY29ycmVjdGlvbiB0ZXJtIGJ1dCBkb24ndCB1c2UgaXQgaWYgaz09MC4KKwkgICAgICovCisJICAgIGlmKGh1PDB4NmEwOWUpIHsJCQkvKiB1IH48IHNxcnQoMikgKi8KKwkgICAgICAgIFNFVF9ISUdIX1dPUkQodSxodXwweDNmZjAwMDAwKTsJLyogbm9ybWFsaXplIHUgKi8KKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGsgKz0gMTsKKwkJU0VUX0hJR0hfV09SRCh1LGh1fDB4M2ZlMDAwMDApOwkvKiBub3JtYWxpemUgdS8yICovCisJICAgICAgICBodSA9ICgweDAwMTAwMDAwLWh1KT4+MjsKKwkgICAgfQorCSAgICBmID0gdS0xLjA7CisJfQorCWhmc3E9MC41KmYqZjsKKwlpZihodT09MCkgewkvKiB8ZnwgPCAyKiotMjAgKi8KKwkgICAgaWYoZj09emVybykgaWYoaz09MCkgcmV0dXJuIHplcm87CisJCQllbHNlIHtjICs9IGsqbG4yX2xvOyByZXR1cm4gaypsbjJfaGkrYzt9CisJICAgIFIgPSBoZnNxKigxLjAtMC42NjY2NjY2NjY2NjY2NjY2NipmKTsKKwkgICAgaWYoaz09MCkgcmV0dXJuIGYtUjsgZWxzZQorCSAgICAJICAgICByZXR1cm4gaypsbjJfaGktKChSLShrKmxuMl9sbytjKSktZik7CisJfQorIAlzID0gZi8oMi4wK2YpOworCXogPSBzKnM7CisJUiA9IHoqKExwMSt6KihMcDIreiooTHAzK3oqKExwNCt6KihMcDUreiooTHA2K3oqTHA3KSkpKSkpOworCWlmKGs9PTApIHJldHVybiBmLShoZnNxLXMqKGhmc3ErUikpOyBlbHNlCisJCSByZXR1cm4gaypsbjJfaGktKChoZnNxLShzKihoZnNxK1IpKyhrKmxuMl9sbytjKSkpLWYpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2cxcGYuYyBiL2xpYm0vc3JjL3NfbG9nMXBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NGRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbG9nMXBmLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIHNfbG9nMXBmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX2xvZzFwLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZzFwZi5jLHYgMS45IDIwMDUvMTIvMDQgMTI6MzA6NDQgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQKK2xuMl9oaSA9ICAgNi45MzEzODEyMjU2ZS0wMSwJLyogMHgzZjMxNzE4MCAqLworbG4yX2xvID0gICA5LjA1ODAwMDYxNDVlLTA2LAkvKiAweDM3MTdmN2QxICovCit0d28yNSA9ICAgIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLworTHAxID0gNi42NjY2NjY4NjUzZS0wMSwJLyogM0YyQUFBQUIgKi8KK0xwMiA9IDQuMDAwMDAwMDU5NmUtMDEsCS8qIDNFQ0NDQ0NEICovCitMcDMgPSAyLjg1NzE0Mjk4NDllLTAxLCAvKiAzRTkyNDkyNSAqLworTHA0ID0gMi4yMjIyMTk4NTQ2ZS0wMSwgLyogM0U2MzhFMjkgKi8KK0xwNSA9IDEuODE4MzU3MjU5MGUtMDEsIC8qIDNFM0EzMzI1ICovCitMcDYgPSAxLjUzMTM4Mzg0MjJlLTAxLCAvKiAzRTFDRDA0RiAqLworTHA3ID0gMS40Nzk4MTk4NjQwZS0wMTsgLyogM0UxNzg4OTcgKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IHplcm8gPSAwLjA7CisKK2Zsb2F0Citsb2cxcGYoZmxvYXQgeCkKK3sKKwlmbG9hdCBoZnNxLGYsYyxzLHosUix1OworCWludDMyX3QgayxoeCxodSxheDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWF4ID0gaHgmMHg3ZmZmZmZmZjsKKworCWsgPSAxOworCWlmIChoeCA8IDB4M2VkNDEzZDApIHsJCQkvKiAxK3ggPCBzcXJ0KDIpKyAgKi8KKwkgICAgaWYoYXg+PTB4M2Y4MDAwMDApIHsJCS8qIHggPD0gLTEuMCAqLworCQlpZih4PT0oZmxvYXQpLTEuMCkgcmV0dXJuIC10d28yNS96ZXJvOyAvKiBsb2cxcCgtMSk9K2luZiAqLworCQllbHNlIHJldHVybiAoeC14KS8oeC14KTsJLyogbG9nMXAoeDwtMSk9TmFOICovCisJICAgIH0KKwkgICAgaWYoYXg8MHgzMTAwMDAwMCkgewkJCS8qIHx4fCA8IDIqKi0yOSAqLworCQlpZih0d28yNSt4Pnplcm8JCQkvKiByYWlzZSBpbmV4YWN0ICovCisJICAgICAgICAgICAgJiZheDwweDI0ODAwMDAwKSAJCS8qIHx4fCA8IDIqKi01NCAqLworCQkgICAgcmV0dXJuIHg7CisJCWVsc2UKKwkJICAgIHJldHVybiB4IC0geCp4KihmbG9hdCkwLjU7CisJICAgIH0KKwkgICAgaWYoaHg+MHx8aHg8PSgoaW50MzJfdCkweGJlOTVmNjE5KSkgeworCQlrPTA7Zj14O2h1PTE7fQkJLyogc3FydCgyKS8yLSA8PSAxK3ggPCBzcXJ0KDIpKyAqLworCX0KKwlpZiAoaHggPj0gMHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsKKwlpZihrIT0wKSB7CisJICAgIGlmKGh4PDB4NWEwMDAwMDApIHsKKwkJKih2b2xhdGlsZSBmbG9hdCAqKSZ1ID0gKGZsb2F0KTEuMCt4OworCQlHRVRfRkxPQVRfV09SRChodSx1KTsKKwkgICAgICAgIGsgID0gKGh1Pj4yMyktMTI3OworCQkvKiBjb3JyZWN0aW9uIHRlcm0gKi8KKwkgICAgICAgIGMgID0gKGs+MCk/IChmbG9hdCkxLjAtKHUteCk6eC0odS0oZmxvYXQpMS4wKTsKKwkJYyAvPSB1OworCSAgICB9IGVsc2UgeworCQl1ICA9IHg7CisJCUdFVF9GTE9BVF9XT1JEKGh1LHUpOworCSAgICAgICAgayAgPSAoaHU+PjIzKS0xMjc7CisJCWMgID0gMDsKKwkgICAgfQorCSAgICBodSAmPSAweDAwN2ZmZmZmOworCSAgICAvKgorCSAgICAgKiBUaGUgYXBwcm94aW1hdGlvbiB0byBzcXJ0KDIpIHVzZWQgaW4gdGhyZXNob2xkcyBpcyBub3QKKwkgICAgICogY3JpdGljYWwuICBIb3dldmVyLCB0aGUgb25lcyB1c2VkIGFib3ZlIG11c3QgZ2l2ZSBsZXNzCisJICAgICAqIHN0cmljdCBib3VuZHMgdGhhbiB0aGUgb25lIGhlcmUgc28gdGhhdCB0aGUgaz09MCBjYXNlIGlzCisJICAgICAqIG5ldmVyIHJlYWNoZWQgZnJvbSBoZXJlLCBzaW5jZSBoZXJlIHdlIGhhdmUgY29tbWl0dGVkIHRvCisJICAgICAqIHVzaW5nIHRoZSBjb3JyZWN0aW9uIHRlcm0gYnV0IGRvbid0IHVzZSBpdCBpZiBrPT0wLgorCSAgICAgKi8KKwkgICAgaWYoaHU8MHgzNTA0ZjQpIHsJCQkvKiB1IDwgc3FydCgyKSAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQodSxodXwweDNmODAwMDAwKTsvKiBub3JtYWxpemUgdSAqLworCSAgICB9IGVsc2UgeworCSAgICAgICAgayArPSAxOworCQlTRVRfRkxPQVRfV09SRCh1LGh1fDB4M2YwMDAwMDApOwkvKiBub3JtYWxpemUgdS8yICovCisJICAgICAgICBodSA9ICgweDAwODAwMDAwLWh1KT4+MjsKKwkgICAgfQorCSAgICBmID0gdS0oZmxvYXQpMS4wOworCX0KKwloZnNxPShmbG9hdCkwLjUqZipmOworCWlmKGh1PT0wKSB7CS8qIHxmfCA8IDIqKi0yMCAqLworCSAgICBpZihmPT16ZXJvKSBpZihrPT0wKSByZXR1cm4gemVybzsKKwkJCWVsc2Uge2MgKz0gaypsbjJfbG87IHJldHVybiBrKmxuMl9oaStjO30KKwkgICAgUiA9IGhmc3EqKChmbG9hdCkxLjAtKGZsb2F0KTAuNjY2NjY2NjY2NjY2NjY2NjYqZik7CisJICAgIGlmKGs9PTApIHJldHVybiBmLVI7IGVsc2UKKwkgICAgCSAgICAgcmV0dXJuIGsqbG4yX2hpLSgoUi0oaypsbjJfbG8rYykpLWYpOworCX0KKyAJcyA9IGYvKChmbG9hdCkyLjArZik7CisJeiA9IHMqczsKKwlSID0geiooTHAxK3oqKExwMit6KihMcDMreiooTHA0K3oqKExwNSt6KihMcDYreipMcDcpKSkpKSk7CisJaWYoaz09MCkgcmV0dXJuIGYtKGhmc3EtcyooaGZzcStSKSk7IGVsc2UKKwkJIHJldHVybiBrKmxuMl9oaS0oKGhmc3EtKHMqKGhmc3ErUikrKGsqbG4yX2xvK2MpKSktZik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xvZ2IuYyBiL2xpYm0vc3JjL3NfbG9nYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWRiODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZ2IuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBAKCMpc19sb2diLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZ2IuYyx2IDEuMTAgMjAwNS8xMi8wMyAxMTo1NzoxOSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBkb3VibGUgbG9nYih4KQorICogSUVFRSA3NTQgbG9nYi4gSW5jbHVkZWQgdG8gcGFzcyBJRUVFIHRlc3Qgc3VpdGUuIE5vdCByZWNvbW1lbmQuCisgKiBVc2UgaWxvZ2IgaW5zdGVhZC4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlCit0d281NCA9IDEuODAxNDM5ODUwOTQ4MTk4NDAwMDBlKzE2OwkvKiA0MzUwMDAwMCAwMDAwMDAwMCAqLworCitkb3VibGUKK2xvZ2IoZG91YmxlIHgpCit7CisJaW50MzJfdCBseCxpeDsKKwlFWFRSQUNUX1dPUkRTKGl4LGx4LHgpOworCWl4ICY9IDB4N2ZmZmZmZmY7CQkJLyogaGlnaCB8eHwgKi8KKwlpZigoaXh8bHgpPT0wKSByZXR1cm4gLTEuMC9mYWJzKHgpOworCWlmKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geCp4OworCWlmKGl4PDB4MDAxMDAwMDApIHsKKwkJeCAqPSB0d281NDsJCSAvKiBjb252ZXJ0IHN1Ym5vcm1hbCB4IHRvIG5vcm1hbCAqLworCQlHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkJaXggJj0gMHg3ZmZmZmZmZjsKKwkJcmV0dXJuIChmbG9hdCkgKChpeD4+MjApLTEwMjMtNTQpOworCX0gZWxzZQorCQlyZXR1cm4gKGRvdWJsZSkgKChpeD4+MjApLTEwMjMpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19sb2diZi5jIGIvbGlibS9zcmMvc19sb2diZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDkyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xvZ2JmLmMKQEAgLTAsMCArMSw0MSBAQAorLyogc19sb2diZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19sb2diLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xvZ2JmLmMsdiAxLjggMjAwNS8xMi8wMyAxMTo1NzoxOSBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdAordHdvMjUgPSAzLjM1NTQ0MzIwMGUrMDc7CQkvKiAweDRjMDAwMDAwICovCisKK2Zsb2F0Citsb2diZihmbG9hdCB4KQoreworCWludDMyX3QgaXg7CisJR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJaXggJj0gMHg3ZmZmZmZmZjsJCQkvKiBoaWdoIHx4fCAqLworCWlmKGl4PT0wKSByZXR1cm4gKGZsb2F0KS0xLjAvZmFic2YoeCk7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4Kng7CisJaWYoaXg8MHgwMDgwMDAwMCkgeworCQl4ICo9IHR3bzI1OwkJIC8qIGNvbnZlcnQgc3Vibm9ybWFsIHggdG8gbm9ybWFsICovCisJCUdFVF9GTE9BVF9XT1JEKGl4LHgpOworCQlpeCAmPSAweDdmZmZmZmZmOworCQlyZXR1cm4gKGZsb2F0KSAoKGl4Pj4yMyktMTI3LTI1KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChmbG9hdCkgKChpeD4+MjMpLTEyNyk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyaW50LmMgYi9saWJtL3NyYy9zX2xyaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhMDlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJpbnQuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIHR5cGUKKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyaW50LmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKyNkZWZpbmUgdHlwZQkJZG91YmxlCisjZGVmaW5lCXJvdW5kaXQJCXJpbnQKKyNkZWZpbmUgZHR5cGUJCWxvbmcKKyNkZWZpbmUJZm4JCWxyaW50CisjZW5kaWYKKworLyoKKyAqIEM5OSBzYXlzIHdlIHNob3VsZCBub3QgcmFpc2UgYSBzcHVyaW91cyBpbmV4YWN0IGV4Y2VwdGlvbiB3aGVuIGFuCisgKiBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGUgc2V0IG9mIGlucHV0cworICogdGhhdCBvdmVyZmxvd3MgZGVwZW5kcyBvbiB0aGUgcm91bmRpbmcgbW9kZSB3aGVuICdkdHlwZScgaGFzIG1vcmUKKyAqIHNpZ25pZmljYW50IGJpdHMgdGhhbiAndHlwZScuICBIZW5jZSwgd2UgYmVuZCBvdmVyIGJhY2t3YXJkcyBmb3IgdGhlCisgKiBzYWtlIG9mIGNvcnJlY3RuZXNzOyBhbiBNRCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBtb3JlIGVmZmljaWVudC4KKyAqLworZHR5cGUKK2ZuKHR5cGUgeCkKK3sKKwlmZW52X3QgZW52OworCWR0eXBlIGQ7CisKKwlmZWhvbGRleGNlcHQoJmVudik7CisJZCA9IChkdHlwZSlyb3VuZGl0KHgpOworCWlmIChmZXRlc3RleGNlcHQoRkVfSU5WQUxJRCkpCisJCWZlY2xlYXJleGNlcHQoRkVfSU5FWEFDVCk7CisJZmV1cGRhdGVlbnYoJmVudik7CisJcmV0dXJuIChkKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJpbnRmLmMgYi9saWJtL3NyYy9zX2xyaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNThlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX2xyaW50Zi5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJpbnRmLmMsdiAxLjEgMjAwNS8wMS8xMSAyMzoxMjo1NSBkYXMgRXhwICQiKTsgKi8KKworI2RlZmluZSB0eXBlCQlmbG9hdAorI2RlZmluZQlyb3VuZGl0CQlyaW50ZgorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlmbgkJbHJpbnRmCisKKyNpbmNsdWRlICJzX2xyaW50LmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX2xyb3VuZC5jIGIvbGlibS9zcmMvc19scm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlmNDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scm91bmQuYwpAQCAtMCwwICsxLDY2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIHR5cGUKKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyb3VuZC5jLHYgMS4yIDIwMDUvMDQvMDggMDA6NTI6MTYgZGFzIEV4cCAkIik7ICovCisjZGVmaW5lIHR5cGUJCWRvdWJsZQorI2RlZmluZQlyb3VuZGl0CQlyb3VuZAorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdfTUFYCisjZGVmaW5lCWZuCQlscm91bmQKKyNlbmRpZgorCisvKgorICogSWYgdHlwZSBoYXMgbW9yZSBwcmVjaXNpb24gdGhhbiBkdHlwZSwgdGhlIGVuZHBvaW50cyBkdHlwZV8obWlufG1heCkgYXJlCisgKiBvZiB0aGUgZm9ybSB4eHguNTsgdGhleSBhcmUgIm91dCBvZiByYW5nZSIgYmVjYXVzZSBscm91bmQoKSByb3VuZHMgYXdheQorICogZnJvbSAwLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHR5cGUgaGFzIGxlc3MgcHJlY2lzaW9uIHRoYW4gZHR5cGUsIHRoZW4KKyAqIGFsbCB2YWx1ZXMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlIGFyZSBpbnRlZ3JhbCwgc28gd2UgbWlnaHQgYXMgd2VsbCBhc3N1bWUKKyAqIHRoYXQgZXZlcnl0aGluZyBpcyBpbiByYW5nZS4gIEF0IGNvbXBpbGUgdGltZSwgSU5SQU5HRSh4KSBzaG91bGQgcmVkdWNlIHRvCisgKiB0d28gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMgaW4gdGhlIGZvcm1lciBjYXNlLCBvciBUUlVFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGNvbnN0IHR5cGUgZHR5cGVfbWluID0gRFRZUEVfTUlOIC0gMC41Oworc3RhdGljIGNvbnN0IHR5cGUgZHR5cGVfbWF4ID0gRFRZUEVfTUFYICsgMC41OworI2RlZmluZQlJTlJBTkdFKHgpCShkdHlwZV9tYXggLSBEVFlQRV9NQVggIT0gMC41IHx8IFwKKwkJCSAoKHgpID4gZHR5cGVfbWluICYmICh4KSA8IGR0eXBlX21heCkpCisKK2R0eXBlCitmbih0eXBlIHgpCit7CisKKwlpZiAoSU5SQU5HRSh4KSkgeworCQl4ID0gcm91bmRpdCh4KTsKKwkJcmV0dXJuICgoZHR5cGUpeCk7CisJfSBlbHNlIHsKKwkJZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKwkJcmV0dXJuIChEVFlQRV9NQVgpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbHJvdW5kZi5jIGIvbGlibS9zcmMvc19scm91bmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2OWM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbHJvdW5kZi5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX2xyb3VuZGYuYyx2IDEuMiAyMDA1LzA0LzA4IDAwOjUyOjI3IGRhcyBFeHAgJCIpOyAqLworCisjZGVmaW5lIHR5cGUJCWZsb2F0CisjZGVmaW5lCXJvdW5kaXQJCXJvdW5kZgorI2RlZmluZSBkdHlwZQkJbG9uZworI2RlZmluZQlEVFlQRV9NSU4JTE9OR19NSU4KKyNkZWZpbmUJRFRZUEVfTUFYCUxPTkdfTUFYCisjZGVmaW5lCWZuCQlscm91bmRmCisKKyNpbmNsdWRlICJzX2xyb3VuZC5jIgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19scm91bmRsLmMgYi9saWJtL3NyYy9zX2xyb3VuZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzNmODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19scm91bmRsLmMKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbHJvdW5kbC5jLHYgMS4xIDIwMDUvMDQvMDggMDE6MjQ6MDggZGFzIEV4cCAkIik7ICovCisKKyNkZWZpbmUgdHlwZQkJbG9uZyBkb3VibGUKKyNkZWZpbmUJcm91bmRpdAkJcm91bmRsCisjZGVmaW5lIGR0eXBlCQlsb25nCisjZGVmaW5lCURUWVBFX01JTglMT05HX01JTgorI2RlZmluZQlEVFlQRV9NQVgJTE9OR19NQVgKKyNkZWZpbmUJZm4JCWxyb3VuZGwKKworI2luY2x1ZGUgInNfbHJvdW5kLmMiCmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX21vZGYuYyBiL2xpYm0vc3JjL3NfbW9kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2ZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX21vZGYuYwpAQCAtMCwwICsxLDc1IEBACisvKiBAKCMpc19tb2RmLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX21vZGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIG1vZGYoZG91YmxlIHgsIGRvdWJsZSAqaXB0cikKKyAqIHJldHVybiBmcmFjdGlvbiBwYXJ0IG9mIHgsIGFuZCByZXR1cm4geCdzIGludGVncmFsIHBhcnQgaW4gKmlwdHIuCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICoKKyAqIEV4Y2VwdGlvbjoKKyAqCU5vIGV4Y2VwdGlvbi4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIG9uZSA9IDEuMDsKKworZG91YmxlCittb2RmKGRvdWJsZSB4LCBkb3VibGUgKmlwdHIpCit7CisJaW50MzJfdCBpMCxpMSxqMDsKKwl1X2ludDMyX3QgaTsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsJLyogZXhwb25lbnQgb2YgeCAqLworCWlmKGowPDIwKSB7CQkJLyogaW50ZWdlciBwYXJ0IGluIGhpZ2ggeCAqLworCSAgICBpZihqMDwwKSB7CQkJLyogfHh8PDEgKi8KKwkgICAgICAgIElOU0VSVF9XT1JEUygqaXB0cixpMCYweDgwMDAwMDAwLDApOwkvKiAqaXB0ciA9ICstMCAqLworCQlyZXR1cm4geDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSB7CQkvKiB4IGlzIGludGVncmFsICovCisJCSAgICB1X2ludDMyX3QgaGlnaDsKKwkJICAgICppcHRyID0geDsKKwkJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwkJICAgIElOU0VSVF9XT1JEUyh4LGhpZ2gmMHg4MDAwMDAwMCwwKTsJLyogcmV0dXJuICstMCAqLworCQkgICAgcmV0dXJuIHg7CisJCX0gZWxzZSB7CisJCSAgICBJTlNFUlRfV09SRFMoKmlwdHIsaTAmKH5pKSwwKTsKKwkJICAgIHJldHVybiB4IC0gKmlwdHI7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsJCS8qIG5vIGZyYWN0aW9uIHBhcnQgKi8KKwkgICAgdV9pbnQzMl90IGhpZ2g7CisJICAgICppcHRyID0geCpvbmU7CisJICAgIEdFVF9ISUdIX1dPUkQoaGlnaCx4KTsKKwkgICAgSU5TRVJUX1dPUkRTKHgsaGlnaCYweDgwMDAwMDAwLDApOwkvKiByZXR1cm4gKy0wICovCisJICAgIHJldHVybiB4OworCX0gZWxzZSB7CQkJLyogZnJhY3Rpb24gcGFydCBpbiBsb3cgeCAqLworCSAgICBpID0gKCh1X2ludDMyX3QpKDB4ZmZmZmZmZmYpKT4+KGowLTIwKTsKKwkgICAgaWYoKGkxJmkpPT0wKSB7IAkJLyogeCBpcyBpbnRlZ3JhbCAqLworCSAgICAgICAgdV9pbnQzMl90IGhpZ2g7CisJCSppcHRyID0geDsKKwkJR0VUX0hJR0hfV09SRChoaWdoLHgpOworCQlJTlNFUlRfV09SRFMoeCxoaWdoJjB4ODAwMDAwMDAsMCk7CS8qIHJldHVybiArLTAgKi8KKwkJcmV0dXJuIHg7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBJTlNFUlRfV09SRFMoKmlwdHIsaTAsaTEmKH5pKSk7CisJCXJldHVybiB4IC0gKmlwdHI7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX21vZGZmLmMgYi9saWJtL3NyYy9zX21vZGZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3NWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbW9kZmYuYwpAQCAtMCwwICsxLDU2IEBACisvKiBzX21vZGZmLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX21vZGYuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbW9kZmYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IG9uZSA9IDEuMDsKKworZmxvYXQKK21vZGZmKGZsb2F0IHgsIGZsb2F0ICppcHRyKQoreworCWludDMyX3QgaTAsajA7CisJdV9pbnQzMl90IGk7CisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJajAgPSAoKGkwPj4yMykmMHhmZiktMHg3ZjsJLyogZXhwb25lbnQgb2YgeCAqLworCWlmKGowPDIzKSB7CQkJLyogaW50ZWdlciBwYXJ0IGluIHggKi8KKwkgICAgaWYoajA8MCkgewkJCS8qIHx4fDwxICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCgqaXB0cixpMCYweDgwMDAwMDAwKTsJLyogKmlwdHIgPSArLTAgKi8KKwkJcmV0dXJuIHg7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHsJCQkvKiB4IGlzIGludGVncmFsICovCisJCSAgICB1X2ludDMyX3QgaXg7CisJCSAgICAqaXB0ciA9IHg7CisJCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkJICAgIFNFVF9GTE9BVF9XT1JEKHgsaXgmMHg4MDAwMDAwMCk7CS8qIHJldHVybiArLTAgKi8KKwkJICAgIHJldHVybiB4OworCQl9IGVsc2UgeworCQkgICAgU0VUX0ZMT0FUX1dPUkQoKmlwdHIsaTAmKH5pKSk7CisJCSAgICByZXR1cm4geCAtICppcHRyOworCQl9CisJICAgIH0KKwl9IGVsc2UgewkJCS8qIG5vIGZyYWN0aW9uIHBhcnQgKi8KKwkgICAgdV9pbnQzMl90IGl4OworCSAgICAqaXB0ciA9IHgqb25lOworCSAgICBHRVRfRkxPQVRfV09SRChpeCx4KTsKKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCxpeCYweDgwMDAwMDAwKTsJLyogcmV0dXJuICstMCAqLworCSAgICByZXR1cm4geDsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25lYXJieWludC5jIGIvbGlibS9zcmMvc19uZWFyYnlpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZkMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZWFyYnlpbnQuYwpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25lYXJieWludC5jLHYgMS4xIDIwMDQvMDcvMDYgMDQ6NDY6MDggZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxmZW52Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKgorICogV2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgdG8gYXZvaWQgcmFpc2luZworICogYW4gaW5leGFjdCBleGNlcHRpb24uICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB1c2luZyBmZXNldGVudigpCisgKiBpbnN0ZWFkIG9mIGZlY2xlYXJleGNlcHQoKS9mZXVwZGF0ZWVudigpIHRvIHJlc3RvcmUgdGhlIGVudmlyb25tZW50CisgKiBiZWNhdXNlIHRoZSBvbmx5IGV4Y2VwdGlvbiBkZWZpbmVkIGZvciByaW50KCkgaXMgb3ZlcmZsb3csIGFuZAorICogcm91bmRpbmcgY2FuJ3Qgb3ZlcmZsb3cgYXMgbG9uZyBhcyBlbWF4ID49IHAuCisgKi8KKyNkZWZpbmUJREVDTCh0eXBlLCBmbiwgcmludCkJXAordHlwZQkJCQlcCitmbih0eXBlIHgpCQkJXAorewkJCQlcCisJdHlwZSByZXQ7CQlcCisJZmVudl90IGVudjsJCVwKKwkJCQlcCisJZmVnZXRlbnYoJmVudik7CQlcCisJcmV0ID0gcmludCh4KTsJCVwKKwlmZXNldGVudigmZW52KTsJCVwKKwlyZXR1cm4gKHJldCk7CQlcCit9CisKK0RFQ0woZG91YmxlLCBuZWFyYnlpbnQsIHJpbnQpCitERUNMKGZsb2F0LCBuZWFyYnlpbnRmLCByaW50ZikKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dGFmdGVyLmMgYi9saWJtL3NyYy9zX25leHRhZnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDAzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHRhZnRlci5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIEAoIylzX25leHRhZnRlci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19uZXh0YWZ0ZXIuYyx2IDEuMTEgMjAwNS8wMy8wNyAyMToyNzozNyBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qIElFRUUgZnVuY3Rpb25zCisgKgluZXh0YWZ0ZXIoeCx5KQorICoJcmV0dXJuIHRoZSBuZXh0IG1hY2hpbmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9mIHggaW4gdGhlCisgKglkaXJlY3Rpb24gdG93YXJkIHkuCisgKiAgIFNwZWNpYWwgY2FzZXM6CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorbmV4dGFmdGVyKGRvdWJsZSB4LCBkb3VibGUgeSkKK3sKKwl2b2xhdGlsZSBkb3VibGUgdDsKKwlpbnQzMl90IGh4LGh5LGl4LGl5OworCXVfaW50MzJfdCBseCxseTsKKworCUVYVFJBQ1RfV09SRFMoaHgsbHgseCk7CisJRVhUUkFDVF9XT1JEUyhoeSxseSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CQkvKiB8eXwgKi8KKworCWlmKCgoaXg+PTB4N2ZmMDAwMDApJiYoKGl4LTB4N2ZmMDAwMDApfGx4KSE9MCkgfHwgICAvKiB4IGlzIG5hbiAqLworCSAgICgoaXk+PTB4N2ZmMDAwMDApJiYoKGl5LTB4N2ZmMDAwMDApfGx5KSE9MCkpICAgICAvKiB5IGlzIG5hbiAqLworCSAgIHJldHVybiB4K3k7CisJaWYoeD09eSkgcmV0dXJuIHk7CQkvKiB4PXksIHJldHVybiB5ICovCisJaWYoKGl4fGx4KT09MCkgewkJCS8qIHggPT0gMCAqLworCSAgICBJTlNFUlRfV09SRFMoeCxoeSYweDgwMDAwMDAwLDEpOwkvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4Pj0wKSB7CQkJCS8qIHggPiAwICovCisJICAgIGlmKGh4Pmh5fHwoKGh4PT1oeSkmJihseD5seSkpKSB7CS8qIHggPiB5LCB4IC09IHVscCAqLworCQlpZihseD09MCkgaHggLT0gMTsKKwkJbHggLT0gMTsKKwkgICAgfSBlbHNlIHsJCQkJLyogeCA8IHksIHggKz0gdWxwICovCisJCWx4ICs9IDE7CisJCWlmKGx4PT0wKSBoeCArPSAxOworCSAgICB9CisJfSBlbHNlIHsJCQkJLyogeCA8IDAgKi8KKwkgICAgaWYoaHk+PTB8fGh4Pmh5fHwoKGh4PT1oeSkmJihseD5seSkpKXsvKiB4IDwgeSwgeCAtPSB1bHAgKi8KKwkJaWYobHg9PTApIGh4IC09IDE7CisJCWx4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPiB5LCB4ICs9IHVscCAqLworCQlseCArPSAxOworCQlpZihseD09MCkgaHggKz0gMTsKKwkgICAgfQorCX0KKwloeSA9IGh4JjB4N2ZmMDAwMDA7CisJaWYoaHk+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGh5PDB4MDAxMDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgSU5TRVJUX1dPUkRTKHksaHgsbHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJcmV0dXJuIHg7Cit9CisKKyNpZiAoTERCTF9NQU5UX0RJRyA9PSA1MykKK19fd2Vha19yZWZlcmVuY2UobmV4dGFmdGVyLCBuZXh0dG93YXJkKTsKK19fd2Vha19yZWZlcmVuY2UobmV4dGFmdGVyLCBuZXh0dG93YXJkbCk7CitfX3dlYWtfcmVmZXJlbmNlKG5leHRhZnRlciwgbmV4dGFmdGVybCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfbmV4dGFmdGVyZi5jIGIvbGlibS9zcmMvc19uZXh0YWZ0ZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlYWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVyZi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIHNfbmV4dGFmdGVyZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19uZXh0YWZ0ZXIuYy4KKyAqIENvbnZlcnNpb24gdG8gZmxvYXQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGlhbkBjeWdudXMuY29tLgorICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dGFmdGVyZi5jLHYgMS4xMCAyMDA1LzAzLzA3IDA0OjU1OjU4IGRhcyBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK25leHRhZnRlcmYoZmxvYXQgeCwgZmxvYXQgeSkKK3sKKwl2b2xhdGlsZSBmbG9hdCB0OworCWludDMyX3QgaHgsaHksaXgsaXk7CisKKwlHRVRfRkxPQVRfV09SRChoeCx4KTsKKwlHRVRfRkxPQVRfV09SRChoeSx5KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwlpeSA9IGh5JjB4N2ZmZmZmZmY7CQkvKiB8eXwgKi8KKworCWlmKChpeD4weDdmODAwMDAwKSB8fCAgIC8qIHggaXMgbmFuICovCisJICAgKGl5PjB4N2Y4MDAwMDApKSAgICAgLyogeSBpcyBuYW4gKi8KKwkgICByZXR1cm4geCt5OworCWlmKHg9PXkpIHJldHVybiB5OwkJLyogeD15LCByZXR1cm4geSAqLworCWlmKGl4PT0wKSB7CQkJCS8qIHggPT0gMCAqLworCSAgICBTRVRfRkxPQVRfV09SRCh4LChoeSYweDgwMDAwMDAwKXwxKTsvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdCA9IHgqeDsKKwkgICAgaWYodD09eCkgcmV0dXJuIHQ7IGVsc2UgcmV0dXJuIHg7CS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJfQorCWlmKGh4Pj0wKSB7CQkJCS8qIHggPiAwICovCisJICAgIGlmKGh4Pmh5KSB7CQkJCS8qIHggPiB5LCB4IC09IHVscCAqLworCQloeCAtPSAxOworCSAgICB9IGVsc2UgewkJCQkvKiB4IDwgeSwgeCArPSB1bHAgKi8KKwkJaHggKz0gMTsKKwkgICAgfQorCX0gZWxzZSB7CQkJCS8qIHggPCAwICovCisJICAgIGlmKGh5Pj0wfHxoeD5oeSl7CQkJLyogeCA8IHksIHggLT0gdWxwICovCisJCWh4IC09IDE7CisJICAgIH0gZWxzZSB7CQkJCS8qIHggPiB5LCB4ICs9IHVscCAqLworCQloeCArPSAxOworCSAgICB9CisJfQorCWh5ID0gaHgmMHg3ZjgwMDAwMDsKKwlpZihoeT49MHg3ZjgwMDAwMCkgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYoaHk8MHgwMDgwMDAwMCkgewkJLyogdW5kZXJmbG93ICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQhPXgpIHsJCS8qIHJhaXNlIHVuZGVyZmxvdyBmbGFnICovCisJICAgICAgICBTRVRfRkxPQVRfV09SRCh5LGh4KTsKKwkJcmV0dXJuIHk7CisJICAgIH0KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHRhZnRlcmwuYyBiL2xpYm0vc3JjL3NfbmV4dGFmdGVybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX25leHRhZnRlcmwuYwpAQCAtMCwwICsxLDgyIEBACisvKiBAKCMpc19uZXh0YWZ0ZXIuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfbmV4dGFmdGVybC5jLHYgMS4xIDIwMDUvMDMvMDcgMDQ6NTY6NDYgZGFzIEV4cCAkIjsKKyNlbmRpZgorCisvKiBJRUVFIGZ1bmN0aW9ucworICoJbmV4dGFmdGVyKHgseSkKKyAqCXJldHVybiB0aGUgbmV4dCBtYWNoaW5lIGZsb2F0aW5nLXBvaW50IG51bWJlciBvZiB4IGluIHRoZQorICoJZGlyZWN0aW9uIHRvd2FyZCB5LgorICogICBTcGVjaWFsIGNhc2VzOgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjaWYgTERCTF9NQVhfRVhQICE9IDB4NDAwMAorI2Vycm9yICJVbnN1cHBvcnRlZCBsb25nIGRvdWJsZSBmb3JtYXQiCisjZW5kaWYKKworbG9uZyBkb3VibGUKK25leHRhZnRlcmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl2b2xhdGlsZSBsb25nIGRvdWJsZSB0OworCXVuaW9uIElFRUVsMmJpdHMgdXgsIHV5OworCisJdXguZSA9IHg7CisJdXkuZSA9IHk7CisKKwlpZiAoKHV4LmJpdHMuZXhwID09IDB4N2ZmZiAmJgorCSAgICAgKCh1eC5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXguYml0cy5tYW5sKSAhPSAwKSB8fAorCSAgICAodXkuYml0cy5leHAgPT0gMHg3ZmZmICYmCisJICAgICAoKHV5LmJpdHMubWFuaCZ+TERCTF9OQklUKXx1eS5iaXRzLm1hbmwpICE9IDApKQorCSAgIHJldHVybiB4K3k7CS8qIHggb3IgeSBpcyBuYW4gKi8KKwlpZih4PT15KSByZXR1cm4geTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZih4PT0wLjApIHsKKwkgICAgdXguYml0cy5tYW5oID0gMDsJCQkvKiByZXR1cm4gKy1taW5zdWJub3JtYWwgKi8KKwkgICAgdXguYml0cy5tYW5sID0gMTsKKwkgICAgdXguYml0cy5zaWduID0gdXkuYml0cy5zaWduOworCSAgICB0ID0gdXguZSp1eC5lOworCSAgICBpZih0PT11eC5lKSByZXR1cm4gdDsgZWxzZSByZXR1cm4gdXguZTsgLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwl9CisJaWYoeD4wLjAgXiB4PHkpIHsJCQkvKiB4IC09IHVscCAqLworCSAgICBpZih1eC5iaXRzLm1hbmw9PTApIHsKKwkJaWYgKCh1eC5iaXRzLm1hbmgmfkxEQkxfTkJJVCk9PTApCisJCSAgICB1eC5iaXRzLmV4cCAtPSAxOworCQl1eC5iaXRzLm1hbmggPSAodXguYml0cy5tYW5oIC0gMSkgfCAodXguYml0cy5tYW5oICYgTERCTF9OQklUKTsKKwkgICAgfQorCSAgICB1eC5iaXRzLm1hbmwgLT0gMTsKKwl9IGVsc2UgewkJCQkvKiB4ICs9IHVscCAqLworCSAgICB1eC5iaXRzLm1hbmwgKz0gMTsKKwkgICAgaWYodXguYml0cy5tYW5sPT0wKSB7CisJCXV4LmJpdHMubWFuaCA9ICh1eC5iaXRzLm1hbmggKyAxKSB8ICh1eC5iaXRzLm1hbmggJiBMREJMX05CSVQpOworCQlpZiAoKHV4LmJpdHMubWFuaCZ+TERCTF9OQklUKT09MCkKKwkJICAgIHV4LmJpdHMuZXhwICs9IDE7CisJICAgIH0KKwl9CisJaWYodXguYml0cy5leHA9PTB4N2ZmZikgcmV0dXJuIHgreDsJLyogb3ZlcmZsb3cgICovCisJaWYodXguYml0cy5leHA9PTApIHsJCQkvKiB1bmRlcmZsb3cgKi8KKwkgICAgbWFza19uYml0X2wodXgpOworCSAgICB0ID0gdXguZSAqIHV4LmU7CisJICAgIGlmKHQhPXV4LmUpCQkJLyogcmFpc2UgdW5kZXJmbG93IGZsYWcgKi8KKwkJcmV0dXJuIHV4LmU7CisJfQorCXJldHVybiB1eC5lOworfQorCitfX3N0cm9uZ19yZWZlcmVuY2UobmV4dGFmdGVybCwgbmV4dHRvd2FyZGwpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19uZXh0dG93YXJkLmMgYi9saWJtL3NyYy9zX25leHR0b3dhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRhNGFkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19uZXh0dG93YXJkLmMKQEAgLTAsMCArMSw3MyBAQAorLyogQCgjKXNfbmV4dGFmdGVyLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHR0b3dhcmQuYyx2IDEuMSAyMDA1LzAzLzA3IDA0OjU2OjQ2IGRhcyBFeHAgJCI7CisjZW5kaWYKKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IGEgbG9uZyBkb3VibGUgaGFzIGEgMTUtYml0IGV4cG9uZW50LiAgT24gc3lzdGVtcworICogd2hlcmUgbG9uZyBkb3VibGUgaXMgdGhlIHNhbWUgYXMgZG91YmxlLCBuZXh0dG93YXJkKCkgaXMgYW4gYWxpYXMKKyAqIGZvciBuZXh0YWZ0ZXIoKSwgc28gd2UgZG9uJ3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImZwbWF0aC5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK2RvdWJsZQorbmV4dHRvd2FyZChkb3VibGUgeCwgbG9uZyBkb3VibGUgeSkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHV5OworCXZvbGF0aWxlIGRvdWJsZSB0OworCWludDMyX3QgaHgsaXg7CisJdV9pbnQzMl90IGx4OworCisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKwlpeCA9IGh4JjB4N2ZmZmZmZmY7CQkvKiB8eHwgKi8KKwl1eS5lID0geTsKKworCWlmKCgoaXg+PTB4N2ZmMDAwMDApJiYoKGl4LTB4N2ZmMDAwMDApfGx4KSE9MCkgfHwKKwkgICAgKHV5LmJpdHMuZXhwID09IDB4N2ZmZiAmJgorCSAgICAgKCh1eS5iaXRzLm1hbmgmfkxEQkxfTkJJVCl8dXkuYml0cy5tYW5sKSAhPSAwKSkKKwkgICByZXR1cm4geCt5OwkvKiB4IG9yIHkgaXMgbmFuICovCisJaWYoeD09eSkgcmV0dXJuIChkb3VibGUpeTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZih4PT0wLjApIHsKKwkgICAgSU5TRVJUX1dPUkRTKHgsdXkuYml0cy5zaWduPDwzMSwxKTsJLyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD4wLjAgXiB4IDwgeSkgewkJCS8qIHggLT0gdWxwICovCisJICAgIGlmKGx4PT0wKSBoeCAtPSAxOworCSAgICBseCAtPSAxOworCX0gZWxzZSB7CQkJCS8qIHggKz0gdWxwICovCisJICAgIGx4ICs9IDE7CisJICAgIGlmKGx4PT0wKSBoeCArPSAxOworCX0KKwlpeCA9IGh4JjB4N2ZmMDAwMDA7CisJaWYoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGl4PDB4MDAxMDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgSU5TRVJUX1dPUkRTKHksaHgsbHgpOworCQlyZXR1cm4geTsKKwkgICAgfQorCX0KKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX25leHR0b3dhcmRmLmMgYi9saWJtL3NyYy9zX25leHR0b3dhcmRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfbmV4dHRvd2FyZGYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX25leHR0b3dhcmRmLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1NzozOCBkYXMgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCisjZGVmaW5lCUxEQkxfSU5GTkFOX0VYUAkoTERCTF9NQVhfRVhQICogMiAtIDEpCisKK2Zsb2F0CituZXh0dG93YXJkZihmbG9hdCB4LCBsb25nIGRvdWJsZSB5KQoreworCXVuaW9uIElFRUVsMmJpdHMgdXk7CisJdm9sYXRpbGUgZmxvYXQgdDsKKwlpbnQzMl90IGh4LGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCYweDdmZmZmZmZmOwkJLyogfHh8ICovCisJdXkuZSA9IHk7CisKKwlpZigoaXg+MHg3ZjgwMDAwMCkgfHwKKwkgICAodXkuYml0cy5leHAgPT0gTERCTF9JTkZOQU5fRVhQICYmCisJICAgICgodXkuYml0cy5tYW5oJn5MREJMX05CSVQpfHV5LmJpdHMubWFubCkgIT0gMCkpCisJICAgcmV0dXJuIHgreTsJLyogeCBvciB5IGlzIG5hbiAqLworCWlmKHg9PXkpIHJldHVybiAoZmxvYXQpeTsJCS8qIHg9eSwgcmV0dXJuIHkgKi8KKwlpZihpeD09MCkgewkJCQkvKiB4ID09IDAgKi8KKwkgICAgU0VUX0ZMT0FUX1dPUkQoeCwodXkuYml0cy5zaWduPDwzMSl8MSk7LyogcmV0dXJuICstbWluc3Vibm9ybWFsICovCisJICAgIHQgPSB4Kng7CisJICAgIGlmKHQ9PXgpIHJldHVybiB0OyBlbHNlIHJldHVybiB4OwkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCX0KKwlpZihoeD49MCBeIHggPCB5KQkJCS8qIHggLT0gdWxwICovCisJICAgIGh4IC09IDE7CisJZWxzZQkJCQkJLyogeCArPSB1bHAgKi8KKwkgICAgaHggKz0gMTsKKwlpeCA9IGh4JjB4N2Y4MDAwMDA7CisJaWYoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4K3g7CS8qIG92ZXJmbG93ICAqLworCWlmKGl4PDB4MDA4MDAwMDApIHsJCS8qIHVuZGVyZmxvdyAqLworCSAgICB0ID0geCp4OworCSAgICBpZih0IT14KSB7CQkvKiByYWlzZSB1bmRlcmZsb3cgZmxhZyAqLworCSAgICAgICAgU0VUX0ZMT0FUX1dPUkQoeSxoeCk7CisJCXJldHVybiB5OworCSAgICB9CisJfQorCVNFVF9GTE9BVF9XT1JEKHgsaHgpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yZW1xdW8uYyBiL2xpYm0vc3JjL3NfcmVtcXVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfcmVtcXVvLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qLQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmVtcXVvLmMsdiAxLjEgMjAwNS8wMy8yNSAwNDo0MDo0NCBkYXMgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBaZXJvW10gPSB7MC4wLCAtMC4wLH07CisKKy8qCisgKiBSZXR1cm4gdGhlIElFRUUgcmVtYWluZGVyIGFuZCBzZXQgKnF1byB0byB0aGUgbGFzdCBuIGJpdHMgb2YgdGhlCisgKiBxdW90aWVudCwgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAgV2UgY2hvb3NlIG49MzEgYmVjYXVzZQorICogd2Ugd2luZCB1cCBjb21wdXRpbmcgYWxsIHRoZSBpbnRlZ2VyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGFueXdheSBhcworICogYSBzaWRlLWVmZmVjdCBvZiBjb21wdXRpbmcgdGhlIHJlbWFpbmRlciBieSB0aGUgc2hpZnQgYW5kIHN1YnRyYWN0CisgKiBtZXRob2QuICBJbiBwcmFjdGljZSwgdGhpcyBpcyBmYXIgbW9yZSBiaXRzIHRoYW4gYXJlIG5lZWRlZCB0byB1c2UKKyAqIHJlbXF1byBpbiByZWR1Y3Rpb24gYWxnb3JpdGhtcy4KKyAqLworZG91YmxlCityZW1xdW8oZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgKnF1bykKK3sKKwlpbnQzMl90IG4saHgsaHksaHosaXgsaXksc3gsaTsKKwl1X2ludDMyX3QgbHgsbHksbHoscSxzeHk7CisKKwlFWFRSQUNUX1dPUkRTKGh4LGx4LHgpOworCUVYVFJBQ1RfV09SRFMoaHksbHkseSk7CisJc3h5ID0gKGh4IF4gaHkpICYgMHg4MDAwMDAwMDsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKChoeXxseSk9PTB8fChoeD49MHg3ZmYwMDAwMCl8fAkvKiB5PTAsb3IgeCBub3QgZmluaXRlICovCisJICAoKGh5fCgobHl8LWx5KT4+MzEpKT4weDdmZjAwMDAwKSkJLyogb3IgeSBpcyBOYU4gKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PD1oeSkgeworCSAgICBpZigoaHg8aHkpfHwobHg8bHkpKSB7CisJCXEgPSAwOworCQlnb3RvIGZpeHVwOwkvKiB8eHw8fHl8IHJldHVybiB4IG9yIHgteSAqLworCSAgICB9CisJICAgIGlmKGx4PT1seSkgeworCQkqcXVvID0gMTsKKwkJcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOwkvKiB8eHw9fHl8IHJldHVybiB4KjAqLworCSAgICB9CisJfQorCisgICAgLyogZGV0ZXJtaW5lIGl4ID0gaWxvZ2IoeCkgKi8KKwlpZihoeDwweDAwMTAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB4ICovCisJICAgIGlmKGh4PT0wKSB7CisJCWZvciAoaXggPSAtMTA0MywgaT1seDsgaT4wOyBpPDw9MSkgaXggLT0xOworCSAgICB9IGVsc2UgeworCQlmb3IgKGl4ID0gLTEwMjIsaT0oaHg8PDExKTsgaT4wOyBpPDw9MSkgaXggLT0xOworCSAgICB9CisJfSBlbHNlIGl4ID0gKGh4Pj4yMCktMTAyMzsKKworICAgIC8qIGRldGVybWluZSBpeSA9IGlsb2diKHkpICovCisJaWYoaHk8MHgwMDEwMDAwMCkgewkvKiBzdWJub3JtYWwgeSAqLworCSAgICBpZihoeT09MCkgeworCQlmb3IgKGl5ID0gLTEwNDMsIGk9bHk7IGk+MDsgaTw8PTEpIGl5IC09MTsKKwkgICAgfSBlbHNlIHsKKwkJZm9yIChpeSA9IC0xMDIyLGk9KGh5PDwxMSk7IGk+MDsgaTw8PTEpIGl5IC09MTsKKwkgICAgfQorCX0gZWxzZSBpeSA9IChoeT4+MjApLTEwMjM7CisKKyAgICAvKiBzZXQgdXAge2h4LGx4fSwge2h5LGx5fSBhbmQgYWxpZ24geSB0byB4ICovCisJaWYoaXggPj0gLTEwMjIpIAorCSAgICBoeCA9IDB4MDAxMDAwMDB8KDB4MDAwZmZmZmYmaHgpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHgsIHNoaWZ0IHggdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTAyMi1peDsKKwkgICAgaWYobjw9MzEpIHsKKwkgICAgICAgIGh4ID0gKGh4PDxuKXwobHg+PigzMi1uKSk7CisJICAgICAgICBseCA8PD0gbjsKKwkgICAgfSBlbHNlIHsKKwkJaHggPSBseDw8KG4tMzIpOworCQlseCA9IDA7CisJICAgIH0KKwl9CisJaWYoaXkgPj0gLTEwMjIpIAorCSAgICBoeSA9IDB4MDAxMDAwMDB8KDB4MDAwZmZmZmYmaHkpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHksIHNoaWZ0IHkgdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTAyMi1peTsKKwkgICAgaWYobjw9MzEpIHsKKwkgICAgICAgIGh5ID0gKGh5PDxuKXwobHk+PigzMi1uKSk7CisJICAgICAgICBseSA8PD0gbjsKKwkgICAgfSBlbHNlIHsKKwkJaHkgPSBseTw8KG4tMzIpOworCQlseSA9IDA7CisJICAgIH0KKwl9CisKKyAgICAvKiBmaXggcG9pbnQgZm1vZCAqLworCW4gPSBpeCAtIGl5OworCXEgPSAwOworCXdoaWxlKG4tLSkgeworCSAgICBoej1oeC1oeTtsej1seC1seTsgaWYobHg8bHkpIGh6IC09IDE7CisJICAgIGlmKGh6PDApe2h4ID0gaHgraHgrKGx4Pj4zMSk7IGx4ID0gbHgrbHg7fQorCSAgICBlbHNlIHtoeCA9IGh6K2h6Kyhsej4+MzEpOyBseCA9IGx6K2x6OyBxKys7fQorCSAgICBxIDw8PSAxOworCX0KKwloej1oeC1oeTtsej1seC1seTsgaWYobHg8bHkpIGh6IC09IDE7CisJaWYoaHo+PTApIHtoeD1oejtseD1sejtxKys7fQorCisgICAgLyogY29udmVydCBiYWNrIHRvIGZsb2F0aW5nIHZhbHVlIGFuZCByZXN0b3JlIHRoZSBzaWduICovCisJaWYoKGh4fGx4KT09MCkgewkJCS8qIHJldHVybiBzaWduKHgpKjAgKi8KKwkgICAgKnF1byA9IChzeHkgPyAtcSA6IHEpOworCSAgICByZXR1cm4gWmVyb1sodV9pbnQzMl90KXN4Pj4zMV07CisJfQorCXdoaWxlKGh4PDB4MDAxMDAwMDApIHsJCS8qIG5vcm1hbGl6ZSB4ICovCisJICAgIGh4ID0gaHgraHgrKGx4Pj4zMSk7IGx4ID0gbHgrbHg7CisJICAgIGl5IC09IDE7CisJfQorCWlmKGl5Pj0gLTEwMjIpIHsJLyogbm9ybWFsaXplIG91dHB1dCAqLworCSAgICBoeCA9ICgoaHgtMHgwMDEwMDAwMCl8KChpeSsxMDIzKTw8MjApKTsKKwl9IGVsc2UgewkJLyogc3Vibm9ybWFsIG91dHB1dCAqLworCSAgICBuID0gLTEwMjIgLSBpeTsKKwkgICAgaWYobjw9MjApIHsKKwkJbHggPSAobHg+Pm4pfCgodV9pbnQzMl90KWh4PDwoMzItbikpOworCQloeCA+Pj0gbjsKKwkgICAgfSBlbHNlIGlmIChuPD0zMSkgeworCQlseCA9IChoeDw8KDMyLW4pKXwobHg+Pm4pOyBoeCA9IHN4OworCSAgICB9IGVsc2UgeworCQlseCA9IGh4Pj4obi0zMik7IGh4ID0gc3g7CisJICAgIH0KKwl9CitmaXh1cDoKKwlJTlNFUlRfV09SRFMoeCxoeCxseCk7CisJeSA9IGZhYnMoeSk7CisJaWYgKHkgPCAweDFwLTEwMjEpIHsKKwkgICAgaWYgKHgreD55IHx8ICh4K3g9PXkgJiYgKHEgJiAxKSkpIHsKKwkJcSsrOworCQl4LT15OworCSAgICB9CisJfSBlbHNlIGlmICh4PjAuNSp5IHx8ICh4PT0wLjUqeSAmJiAocSAmIDEpKSkgeworCSAgICBxKys7CisJICAgIHgtPXk7CisJfQorCUdFVF9ISUdIX1dPUkQoaHgseCk7CisJU0VUX0hJR0hfV09SRCh4LGh4XnN4KTsKKwlxICY9IDB4N2ZmZmZmZmY7CisJKnF1byA9IChzeHkgPyAtcSA6IHEpOworCXJldHVybiB4OworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yZW1xdW9mLmMgYi9saWJtL3NyYy9zX3JlbXF1b2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcyMmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yZW1xdW9mLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIEAoIyllX2Ztb2QuYyAxLjMgOTUvMDEvMTggKi8KKy8qLQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuU29mdCwgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorLyogX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfcmVtcXVvZi5jLHYgMS4xIDIwMDUvMDMvMjUgMDQ6NDA6NDQgZGFzIEV4cCAkIik7ICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBmbG9hdCBaZXJvW10gPSB7MC4wLCAtMC4wLH07CisKKy8qCisgKiBSZXR1cm4gdGhlIElFRUUgcmVtYWluZGVyIGFuZCBzZXQgKnF1byB0byB0aGUgbGFzdCBuIGJpdHMgb2YgdGhlCisgKiBxdW90aWVudCwgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAgV2UgY2hvb3NlIG49MzEgYmVjYXVzZQorICogd2Ugd2luZCB1cCBjb21wdXRpbmcgYWxsIHRoZSBpbnRlZ2VyIGJpdHMgb2YgdGhlIHF1b3RpZW50IGFueXdheSBhcworICogYSBzaWRlLWVmZmVjdCBvZiBjb21wdXRpbmcgdGhlIHJlbWFpbmRlciBieSB0aGUgc2hpZnQgYW5kIHN1YnRyYWN0CisgKiBtZXRob2QuICBJbiBwcmFjdGljZSwgdGhpcyBpcyBmYXIgbW9yZSBiaXRzIHRoYW4gYXJlIG5lZWRlZCB0byB1c2UKKyAqIHJlbXF1byBpbiByZWR1Y3Rpb24gYWxnb3JpdGhtcy4KKyAqLworZmxvYXQKK3JlbXF1b2YoZmxvYXQgeCwgZmxvYXQgeSwgaW50ICpxdW8pCit7CisJaW50MzJfdCBuLGh4LGh5LGh6LGl4LGl5LHN4LGk7CisJdV9pbnQzMl90IHEsc3h5OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJR0VUX0ZMT0FUX1dPUkQoaHkseSk7CisJc3h5ID0gKGh4IF4gaHkpICYgMHg4MDAwMDAwMDsKKwlzeCA9IGh4JjB4ODAwMDAwMDA7CQkvKiBzaWduIG9mIHggKi8KKwloeCBePXN4OwkJLyogfHh8ICovCisJaHkgJj0gMHg3ZmZmZmZmZjsJLyogfHl8ICovCisKKyAgICAvKiBwdXJnZSBvZmYgZXhjZXB0aW9uIHZhbHVlcyAqLworCWlmKGh5PT0wfHxoeD49MHg3ZjgwMDAwMHx8aHk+MHg3ZjgwMDAwMCkgLyogeT0wLE5hTjtvciB4IG5vdCBmaW5pdGUgKi8KKwkgICAgcmV0dXJuICh4KnkpLyh4KnkpOworCWlmKGh4PGh5KSB7CisJICAgIHEgPSAwOworCSAgICBnb3RvIGZpeHVwOwkvKiB8eHw8fHl8IHJldHVybiB4IG9yIHgteSAqLworCX0gZWxzZSBpZihoeD09aHkpIHsKKwkgICAgKnF1byA9IDE7CisJICAgIHJldHVybiBaZXJvWyh1X2ludDMyX3Qpc3g+PjMxXTsJLyogfHh8PXx5fCByZXR1cm4geCowKi8KKwl9CisKKyAgICAvKiBkZXRlcm1pbmUgaXggPSBpbG9nYih4KSAqLworCWlmKGh4PDB4MDA4MDAwMDApIHsJLyogc3Vibm9ybWFsIHggKi8KKwkgICAgZm9yIChpeCA9IC0xMjYsaT0oaHg8PDgpOyBpPjA7IGk8PD0xKSBpeCAtPTE7CisJfSBlbHNlIGl4ID0gKGh4Pj4yMyktMTI3OworCisgICAgLyogZGV0ZXJtaW5lIGl5ID0gaWxvZ2IoeSkgKi8KKwlpZihoeTwweDAwODAwMDAwKSB7CS8qIHN1Ym5vcm1hbCB5ICovCisJICAgIGZvciAoaXkgPSAtMTI2LGk9KGh5PDw4KTsgaT4wOyBpPDw9MSkgaXkgLT0xOworCX0gZWxzZSBpeSA9IChoeT4+MjMpLTEyNzsKKworICAgIC8qIHNldCB1cCB7aHgsbHh9LCB7aHksbHl9IGFuZCBhbGlnbiB5IHRvIHggKi8KKwlpZihpeCA+PSAtMTI2KQorCSAgICBoeCA9IDB4MDA4MDAwMDB8KDB4MDA3ZmZmZmYmaHgpOworCWVsc2UgewkJLyogc3Vibm9ybWFsIHgsIHNoaWZ0IHggdG8gbm9ybWFsICovCisJICAgIG4gPSAtMTI2LWl4OworCSAgICBoeCA8PD0gbjsKKwl9CisJaWYoaXkgPj0gLTEyNikKKwkgICAgaHkgPSAweDAwODAwMDAwfCgweDAwN2ZmZmZmJmh5KTsKKwllbHNlIHsJCS8qIHN1Ym5vcm1hbCB5LCBzaGlmdCB5IHRvIG5vcm1hbCAqLworCSAgICBuID0gLTEyNi1peTsKKwkgICAgaHkgPDw9IG47CisJfQorCisgICAgLyogZml4IHBvaW50IGZtb2QgKi8KKwluID0gaXggLSBpeTsKKwlxID0gMDsKKwl3aGlsZShuLS0pIHsKKwkgICAgaHo9aHgtaHk7CisJICAgIGlmKGh6PDApIGh4ID0gaHggPDwgMTsKKwkgICAgZWxzZSB7aHggPSBoeiA8PCAxOyBxKys7fQorCSAgICBxIDw8PSAxOworCX0KKwloej1oeC1oeTsKKwlpZihoej49MCkge2h4PWh6O3ErKzt9CisKKyAgICAvKiBjb252ZXJ0IGJhY2sgdG8gZmxvYXRpbmcgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHNpZ24gKi8KKwlpZihoeD09MCkgewkJCQkvKiByZXR1cm4gc2lnbih4KSowICovCisJICAgICpxdW8gPSAoc3h5ID8gLXEgOiBxKTsKKwkgICAgcmV0dXJuIFplcm9bKHVfaW50MzJfdClzeD4+MzFdOworCX0KKwl3aGlsZShoeDwweDAwODAwMDAwKSB7CQkvKiBub3JtYWxpemUgeCAqLworCSAgICBoeCA8PD0gMTsKKwkgICAgaXkgLT0gMTsKKwl9CisJaWYoaXk+PSAtMTI2KSB7CQkvKiBub3JtYWxpemUgb3V0cHV0ICovCisJICAgIGh4ID0gKChoeC0weDAwODAwMDAwKXwoKGl5KzEyNyk8PDIzKSk7CisJfSBlbHNlIHsJCS8qIHN1Ym5vcm1hbCBvdXRwdXQgKi8KKwkgICAgbiA9IC0xMjYgLSBpeTsKKwkgICAgaHggPj49IG47CisJfQorZml4dXA6CisJU0VUX0ZMT0FUX1dPUkQoeCxoeCk7CisJeSA9IGZhYnNmKHkpOworCWlmICh5IDwgMHgxcC0xMjVmKSB7CisJICAgIGlmICh4K3g+eSB8fCAoeCt4PT15ICYmIChxICYgMSkpKSB7CisJCXErKzsKKwkJeC09eTsKKwkgICAgfQorCX0gZWxzZSBpZiAoeD4wLjVmKnkgfHwgKHg9PTAuNWYqeSAmJiAocSAmIDEpKSkgeworCSAgICBxKys7CisJICAgIHgtPXk7CisJfQorCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCVNFVF9GTE9BVF9XT1JEKHgsaHhec3gpOworCXEgJj0gMHg3ZmZmZmZmZjsKKwkqcXVvID0gKHN4eSA/IC1xIDogcSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3JpbnQuYyBiL2xpYm0vc3JjL3NfcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JpbnQuYwpAQCAtMCwwICsxLDg3IEBACisvKiBAKCMpc19yaW50LmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JpbnQuYyx2IDEuMTMgMjAwNS8xMi8wMyAwNzozODozNSBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiByaW50KHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvIGludGVncmFsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcHJldmFpbGluZworICogcm91bmRpbmcgbW9kZS4KKyAqIE1ldGhvZDoKKyAqCVVzaW5nIGZsb2F0aW5nIGFkZGl0aW9uLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byByaW50KHgpLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUKK1RXTzUyWzJdPXsKKyAgNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4NDMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KKyAtNC41MDM1OTk2MjczNzA0OTYwMDAwMGUrMTUsIC8qIDB4QzMzMDAwMDAsIDB4MDAwMDAwMDAgKi8KK307CisKK2RvdWJsZQorcmludChkb3VibGUgeCkKK3sKKwlpbnQzMl90IGkwLGowLHN4OworCXVfaW50MzJfdCBpLGkxOworCWRvdWJsZSB3LHQ7CisJRVhUUkFDVF9XT1JEUyhpMCxpMSx4KTsKKwlzeCA9IChpMD4+MzEpJjE7CisJajAgPSAoKGkwPj4yMCkmMHg3ZmYpLTB4M2ZmOworCWlmKGowPDIwKSB7CisJICAgIGlmKGowPDApIHsKKwkJaWYoKChpMCYweDdmZmZmZmZmKXxpMSk9PTApIHJldHVybiB4OworCQlpMSB8PSAoaTAmMHgwZmZmZmYpOworCQlpMCAmPSAweGZmZmUwMDAwOworCQlpMCB8PSAoKGkxfC1pMSk+PjEyKSYweDgwMDAwOworCQlTRVRfSElHSF9XT1JEKHgsaTApOworCSAgICAgICAgdyA9IFRXTzUyW3N4XSt4OworCSAgICAgICAgdCA9ICB3LVRXTzUyW3N4XTsKKwkJR0VUX0hJR0hfV09SRChpMCx0KTsKKwkJU0VUX0hJR0hfV09SRCh0LChpMCYweDdmZmZmZmZmKXwoc3g8PDMxKSk7CisJICAgICAgICByZXR1cm4gdDsKKwkgICAgfSBlbHNlIHsKKwkJaSA9ICgweDAwMGZmZmZmKT4+ajA7CisJCWlmKCgoaTAmaSl8aTEpPT0wKSByZXR1cm4geDsgLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpPj49MTsKKwkJaWYoKChpMCZpKXxpMSkhPTApIHsKKwkJICAgIC8qCisJCSAgICAgKiBTb21lIGJpdCBpcyBzZXQgYWZ0ZXIgdGhlIDAuNSBiaXQuICBUbyBhdm9pZCB0aGUKKwkJICAgICAqIHBvc3NpYmlsaXR5IG9mIGVycm9ycyBmcm9tIGRvdWJsZSByb3VuZGluZyBpbgorCQkgICAgICogdyA9IFRXTzUyW3N4XSt4LCBhZGp1c3QgdGhlIDAuMjUgYml0IHRvIGEgbG93ZXIKKwkJICAgICAqIGd1YXJkIGJpdC4gIFdlIGRvIHRoaXMgZm9yIGFsbCBqMDw9NTEuICBUaGUKKwkJICAgICAqIGFkanVzdG1lbnQgaXMgdHJpY2tpZXN0IGZvciBqMD09MTggYW5kIGowPT0xOQorCQkgICAgICogc2luY2UgdGhlbiBpdCBzcGFucyB0aGUgd29yZCBib3VuZGFyeS4KKwkJICAgICAqLworCQkgICAgaWYoajA9PTE5KSBpMSA9IDB4NDAwMDAwMDA7IGVsc2UKKwkJICAgIGlmKGowPT0xOCkgaTEgPSAweDgwMDAwMDAwOyBlbHNlCisJCSAgICBpMCA9IChpMCYofmkpKXwoKDB4MjAwMDApPj5qMCk7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaT4+PTE7CisJICAgIGlmKChpMSZpKSE9MCkgaTEgPSAoaTEmKH5pKSl8KCgweDQwMDAwMDAwKT4+KGowLTIwKSk7CisJfQorCUlOU0VSVF9XT1JEUyh4LGkwLGkxKTsKKwkqKHZvbGF0aWxlIGRvdWJsZSAqKSZ3ID0gVFdPNTJbc3hdK3g7CS8qIGNsaXAgYW55IGV4dHJhIHByZWNpc2lvbiAqLworCXJldHVybiB3LVRXTzUyW3N4XTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfcmludGYuYyBiL2xpYm0vc3JjL3NfcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19yaW50Zi5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIHNfcmludGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfcmludC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yaW50Zi5jLHYgMS4xMCAyMDA1LzEyLzAzIDA5OjAwOjI5IGJkZSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0CitUV08yM1syXT17CisgIDguMzg4NjA4MDAwMGUrMDYsIC8qIDB4NGIwMDAwMDAgKi8KKyAtOC4zODg2MDgwMDAwZSswNiwgLyogMHhjYjAwMDAwMCAqLworfTsKKworZmxvYXQKK3JpbnRmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMCxzeDsKKwl2b2xhdGlsZSBmbG9hdCB3LHQ7CS8qIHZvbGF0aWxlIHdvcmtzIGFyb3VuZCBnY2MgYnVnICovCisJR0VUX0ZMT0FUX1dPUkQoaTAseCk7CisJc3ggPSAoaTA+PjMxKSYxOworCWowID0gKChpMD4+MjMpJjB4ZmYpLTB4N2Y7CisJaWYoajA8MjMpIHsKKwkgICAgaWYoajA8MCkgeworCQlpZigoaTAmMHg3ZmZmZmZmZik9PTApIHJldHVybiB4OworCSAgICAgICAgdyA9IFRXTzIzW3N4XSt4OworCSAgICAgICAgdCA9ICB3LVRXTzIzW3N4XTsKKwkJR0VUX0ZMT0FUX1dPUkQoaTAsdCk7CisJCVNFVF9GTE9BVF9XT1JEKHQsKGkwJjB4N2ZmZmZmZmYpfChzeDw8MzEpKTsKKwkgICAgICAgIHJldHVybiB0OworCSAgICB9CisJICAgIHcgPSBUV08yM1tzeF0reDsKKwkgICAgcmV0dXJuIHctVFdPMjNbc3hdOworCX0KKwlpZihqMD09MHg4MCkgcmV0dXJuIHgreDsJLyogaW5mIG9yIE5hTiAqLworCWVsc2UgcmV0dXJuIHg7CQkJLyogeCBpcyBpbnRlZ3JhbCAqLworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yb3VuZC5jIGIvbGlibS9zcmMvc19yb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGMxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JvdW5kLmMKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JvdW5kLmMsdiAxLjQgMjAwNS8xMi8wMiAxMzo0NTowNiBiZGUgRXhwICQiKTsgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCityb3VuZChkb3VibGUgeCkKK3sKKwlkb3VibGUgdDsKKworCWlmICghaXNmaW5pdGUoeCkpCisJCXJldHVybiAoeCk7CisKKwlpZiAoeCA+PSAwLjApIHsKKwkJdCA9IGZsb29yKHgpOworCQlpZiAodCAtIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKHQpOworCX0gZWxzZSB7CisJCXQgPSBmbG9vcigteCk7CisJCWlmICh0ICsgeCA8PSAtMC41KQorCQkJdCArPSAxLjA7CisJCXJldHVybiAoLXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfcm91bmRmLmMgYi9saWJtL3NyYy9zX3JvdW5kZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyM2JlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3JvdW5kZi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDAzLCBTdGV2ZW4gRy4gS2FyZ2wKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlIHVubW9kaWZpZWQsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19yb3VuZGYuYyx2IDEuNCAyMDA1LzEyLzAyIDEzOjQ1OjA2IGJkZSBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitmbG9hdAorcm91bmRmKGZsb2F0IHgpCit7CisJZmxvYXQgdDsKKworCWlmICghaXNmaW5pdGUoeCkpCisJCXJldHVybiAoeCk7CisKKwlpZiAoeCA+PSAwLjApIHsKKwkJdCA9IGZsb29yZih4KTsKKwkJaWYgKHQgLSB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICh0KTsKKwl9IGVsc2UgeworCQl0ID0gZmxvb3JmKC14KTsKKwkJaWYgKHQgKyB4IDw9IC0wLjUpCisJCQl0ICs9IDEuMDsKKwkJcmV0dXJuICgtdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19yb3VuZGwuYyBiL2xpYm0vc3JjL3Nfcm91bmRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfcm91bmRsLmMKQEAgLTAsMCArMSw1MSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFN0ZXZlbiBHLiBLYXJnbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UgdW5tb2RpZmllZCwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3JvdW5kbC5jLHYgMS4yIDIwMDUvMTIvMDIgMTM6NDU6MDYgYmRlIEV4cCAkIik7ICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK2xvbmcgZG91YmxlCityb3VuZGwobG9uZyBkb3VibGUgeCkKK3sKKwlsb25nIGRvdWJsZSB0OworCisJaWYgKCFpc2Zpbml0ZSh4KSkKKwkJcmV0dXJuICh4KTsKKworCWlmICh4ID49IDAuMCkgeworCQl0ID0gZmxvb3JsKHgpOworCQlpZiAodCAtIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKHQpOworCX0gZWxzZSB7CisJCXQgPSBmbG9vcmwoLXgpOworCQlpZiAodCArIHggPD0gLTAuNSkKKwkJCXQgKz0gMS4wOworCQlyZXR1cm4gKC10KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NjYWxibG4uYyBiL2xpYm0vc3JjL3Nfc2NhbGJsbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTA4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibG4uYwpAQCAtMCwwICsxLDc2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTY2h1bHR6IDxkYXNARnJlZUJTRC5PUkc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NjYWxibG4uYyx2IDEuMiAyMDA1LzAzLzA3IDA0OjU3OjUwIGRhcyBFeHAgJCIpOyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK3NjYWxibG4gKGRvdWJsZSB4LCBsb25nIG4pCit7CisJaW50IGluOworCisJaW4gPSAoaW50KW47CisJaWYgKGluICE9IG4pIHsKKwkJaWYgKG4gPiAwKQorCQkJaW4gPSBJTlRfTUFYOworCQllbHNlCisJCQlpbiA9IElOVF9NSU47CisJfQorCXJldHVybiAoc2NhbGJuKHgsIGluKSk7Cit9CisKK2Zsb2F0CitzY2FsYmxuZiAoZmxvYXQgeCwgbG9uZyBuKQoreworCWludCBpbjsKKworCWluID0gKGludCluOworCWlmIChpbiAhPSBuKSB7CisJCWlmIChuID4gMCkKKwkJCWluID0gSU5UX01BWDsKKwkJZWxzZQorCQkJaW4gPSBJTlRfTUlOOworCX0KKwlyZXR1cm4gKHNjYWxibmYoeCwgaW4pKTsKK30KKworbG9uZyBkb3VibGUKK3NjYWxibG5sIChsb25nIGRvdWJsZSB4LCBsb25nIG4pCit7CisJaW50IGluOworCisJaW4gPSAoaW50KW47CisJaWYgKGluICE9IG4pIHsKKwkJaWYgKG4gPiAwKQorCQkJaW4gPSBJTlRfTUFYOworCQllbHNlCisJCQlpbiA9IElOVF9NSU47CisJfQorCXJldHVybiAoc2NhbGJubCh4LCAoaW50KW4pKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJuLmMgYi9saWJtL3NyYy9zX3NjYWxibi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMThjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NjYWxibi5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEAoIylzX3NjYWxibi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm4uYyx2IDEuMTEgMjAwNS8wMy8wNyAyMToyNzozNyBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBzY2FsYm4gKGRvdWJsZSB4LCBpbnQgbikKKyAqIHNjYWxibih4LG4pIHJldHVybnMgeCogMioqbiAgY29tcHV0ZWQgYnkgIGV4cG9uZW50CisgKiBtYW5pcHVsYXRpb24gcmF0aGVyIHRoYW4gYnkgYWN0dWFsbHkgcGVyZm9ybWluZyBhbgorICogZXhwb25lbnRpYXRpb24gb3IgYSBtdWx0aXBsaWNhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZQordHdvNTQgICA9ICAxLjgwMTQzOTg1MDk0ODE5ODQwMDAwZSsxNiwgLyogMHg0MzUwMDAwMCwgMHgwMDAwMDAwMCAqLwordHdvbTU0ICA9ICA1LjU1MTExNTEyMzEyNTc4MjcwMjEyZS0xNywgLyogMHgzQzkwMDAwMCwgMHgwMDAwMDAwMCAqLworaHVnZSAgID0gMS4wZSszMDAsCit0aW55ICAgPSAxLjBlLTMwMDsKKworZG91YmxlCitzY2FsYm4gKGRvdWJsZSB4LCBpbnQgbikKK3sKKwlpbnQzMl90IGssaHgsbHg7CisJRVhUUkFDVF9XT1JEUyhoeCxseCx4KTsKKyAgICAgICAgayA9IChoeCYweDdmZjAwMDAwKT4+MjA7CQkvKiBleHRyYWN0IGV4cG9uZW50ICovCisgICAgICAgIGlmIChrPT0wKSB7CQkJCS8qIDAgb3Igc3Vibm9ybWFsIHggKi8KKyAgICAgICAgICAgIGlmICgobHh8KGh4JjB4N2ZmZmZmZmYpKT09MCkgcmV0dXJuIHg7IC8qICstMCAqLworCSAgICB4ICo9IHR3bzU0OworCSAgICBHRVRfSElHSF9XT1JEKGh4LHgpOworCSAgICBrID0gKChoeCYweDdmZjAwMDAwKT4+MjApIC0gNTQ7CisgICAgICAgICAgICBpZiAobjwgLTUwMDAwKSByZXR1cm4gdGlueSp4OyAJLyp1bmRlcmZsb3cqLworCSAgICB9CisgICAgICAgIGlmIChrPT0weDdmZikgcmV0dXJuIHgreDsJCS8qIE5hTiBvciBJbmYgKi8KKyAgICAgICAgayA9IGsrbjsKKyAgICAgICAgaWYgKGsgPiAgMHg3ZmUpIHJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7IC8qIG92ZXJmbG93ICAqLworICAgICAgICBpZiAoayA+IDApIAkJCQkvKiBub3JtYWwgcmVzdWx0ICovCisJICAgIHtTRVRfSElHSF9XT1JEKHgsKGh4JjB4ODAwZmZmZmYpfChrPDwyMCkpOyByZXR1cm4geDt9CisgICAgICAgIGlmIChrIDw9IC01NCkKKyAgICAgICAgICAgIGlmIChuID4gNTAwMDApIAkvKiBpbiBjYXNlIGludGVnZXIgb3ZlcmZsb3cgaW4gbitrICovCisJCXJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduKHRpbnkseCk7IAkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gNTQ7CQkJCS8qIHN1Ym5vcm1hbCByZXN1bHQgKi8KKwlTRVRfSElHSF9XT1JEKHgsKGh4JjB4ODAwZmZmZmYpfChrPDwyMCkpOworICAgICAgICByZXR1cm4geCp0d29tNTQ7Cit9CisKKy8vIHRoaXMgaXMgbm9ybWFsbHkgaW4gRnJlZUJTRCdzIGxpYmMuCitkb3VibGUKK2xkZXhwIChkb3VibGUgeCwgaW50IG4pCit7CisgICAgcmV0dXJuIHNjYWxibih4LG4pOworfQorCisjaWYgKExEQkxfTUFOVF9ESUcgPT0gNTMpICAgIC8vWFhYOiBicmlhbiBGSVhNRSBfX3dlYWtfcmVmZXJlbmNlIGRvZXNuIHdvcmsKK2xvbmcgZG91YmxlIGxkZXhwbCAobG9uZyBkb3VibGUgeCwgaW50IG4pIHsKKyAgICByZXR1cm4gc2NhbGJuKChkb3VibGUpeCxuKTsKK30KK2xvbmcgZG91YmxlIHNjYWxibmwgKGxvbmcgZG91YmxlIHgsIGludCBuKSB7CisgICAgcmV0dXJuIHNjYWxibigoZG91YmxlKXgsbik7Cit9CitfX3dlYWtfcmVmZXJlbmNlKHNjYWxibiwgbGRleHBsKTsKK19fd2Vha19yZWZlcmVuY2Uoc2NhbGJuLCBzY2FsYm5sKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zY2FsYm5mLmMgYi9saWJtL3NyYy9zX3NjYWxibmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM3YmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zY2FsYm5mLmMKQEAgLTAsMCArMSw1OCBAQAorLyogc19zY2FsYm5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3NjYWxibi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm5mLmMsdiAxLjggMjAwNS8wMy8wNyAwNDo1Mjo0MyBkYXMgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0Cit0d28yNSAgID0gIDMuMzU1NDQzMjAwZSswNywJLyogMHg0YzAwMDAwMCAqLwordHdvbTI1ICA9ICAyLjk4MDIzMjIzODhlLTA4LAkvKiAweDMzMDAwMDAwICovCitodWdlICAgPSAxLjBlKzMwLAordGlueSAgID0gMS4wZS0zMDsKKworZmxvYXQKK3NjYWxibmYgKGZsb2F0IHgsIGludCBuKQoreworCWludDMyX3QgayxpeDsKKwlHRVRfRkxPQVRfV09SRChpeCx4KTsKKyAgICAgICAgayA9IChpeCYweDdmODAwMDAwKT4+MjM7CQkvKiBleHRyYWN0IGV4cG9uZW50ICovCisgICAgICAgIGlmIChrPT0wKSB7CQkJCS8qIDAgb3Igc3Vibm9ybWFsIHggKi8KKyAgICAgICAgICAgIGlmICgoaXgmMHg3ZmZmZmZmZik9PTApIHJldHVybiB4OyAvKiArLTAgKi8KKwkgICAgeCAqPSB0d28yNTsKKwkgICAgR0VUX0ZMT0FUX1dPUkQoaXgseCk7CisJICAgIGsgPSAoKGl4JjB4N2Y4MDAwMDApPj4yMykgLSAyNTsKKyAgICAgICAgICAgIGlmIChuPCAtNTAwMDApIHJldHVybiB0aW55Kng7IAkvKnVuZGVyZmxvdyovCisJICAgIH0KKyAgICAgICAgaWYgKGs9PTB4ZmYpIHJldHVybiB4K3g7CQkvKiBOYU4gb3IgSW5mICovCisgICAgICAgIGsgPSBrK247CisgICAgICAgIGlmIChrID4gIDB4ZmUpIHJldHVybiBodWdlKmNvcHlzaWduZihodWdlLHgpOyAvKiBvdmVyZmxvdyAgKi8KKyAgICAgICAgaWYgKGsgPiAwKSAJCQkJLyogbm9ybWFsIHJlc3VsdCAqLworCSAgICB7U0VUX0ZMT0FUX1dPUkQoeCwoaXgmMHg4MDdmZmZmZil8KGs8PDIzKSk7IHJldHVybiB4O30KKyAgICAgICAgaWYgKGsgPD0gLTI1KQorICAgICAgICAgICAgaWYgKG4gPiA1MDAwMCkgCS8qIGluIGNhc2UgaW50ZWdlciBvdmVyZmxvdyBpbiBuK2sgKi8KKwkJcmV0dXJuIGh1Z2UqY29weXNpZ25mKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduZih0aW55LHgpOwkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gMjU7CQkJCS8qIHN1Ym5vcm1hbCByZXN1bHQgKi8KKwlTRVRfRkxPQVRfV09SRCh4LChpeCYweDgwN2ZmZmZmKXwoazw8MjMpKTsKKyAgICAgICAgcmV0dXJuIHgqdHdvbTI1OworfQorCitfX3N0cm9uZ19yZWZlcmVuY2Uoc2NhbGJuZiwgbGRleHBmKTsKZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2NhbGJubC5jIGIvbGlibS9zcmMvc19zY2FsYm5sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0NWQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2NhbGJubC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIEAoIylzX3NjYWxibi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zY2FsYm5sLmMsdiAxLjEgMjAwNS8wMy8wNyAwNDo1Mjo1OCBkYXMgRXhwICQiOworI2VuZGlmCisKKy8qCisgKiBzY2FsYm5sIChsb25nIGRvdWJsZSB4LCBpbnQgbikKKyAqIHNjYWxibmwoeCxuKSByZXR1cm5zIHgqIDIqKm4gIGNvbXB1dGVkIGJ5ICBleHBvbmVudAorICogbWFuaXB1bGF0aW9uIHJhdGhlciB0aGFuIGJ5IGFjdHVhbGx5IHBlcmZvcm1pbmcgYW4KKyAqIGV4cG9uZW50aWF0aW9uIG9yIGEgbXVsdGlwbGljYXRpb24uCisgKi8KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0IGEgbG9uZyBkb3VibGUgaGFzIGEgMTUtYml0IGV4cG9uZW50LiAgT24gc3lzdGVtcworICogd2hlcmUgbG9uZyBkb3VibGUgaXMgdGhlIHNhbWUgYXMgZG91YmxlLCBzY2FsYm5sKCkgaXMgYW4gYWxpYXMKKyAqIGZvciBzY2FsYm4oKSwgc28gd2UgZG9uJ3QgdXNlIHRoaXMgcm91dGluZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJmcG1hdGguaCIKKworI2lmIExEQkxfTUFYX0VYUCAhPSAweDQwMDAKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbG9uZyBkb3VibGUgZm9ybWF0IgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBsb25nIGRvdWJsZQoraHVnZSA9IDB4MXAxNjAwMEwsCit0aW55ID0gMHgxcC0xNjAwMEw7CisKK2xvbmcgZG91YmxlCitzY2FsYm5sIChsb25nIGRvdWJsZSB4LCBpbnQgbikKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHU7CisJaW50IGs7CisJdS5lID0geDsKKyAgICAgICAgayA9IHUuYml0cy5leHA7CQkJCS8qIGV4dHJhY3QgZXhwb25lbnQgKi8KKyAgICAgICAgaWYgKGs9PTApIHsJCQkJLyogMCBvciBzdWJub3JtYWwgeCAqLworICAgICAgICAgICAgaWYgKCh1LmJpdHMubWFuaHx1LmJpdHMubWFubCk9PTApIHJldHVybiB4OwkvKiArLTAgKi8KKwkgICAgdS5lICo9IDB4MXArMTI4OworCSAgICBrID0gdS5iaXRzLmV4cCAtIDEyODsKKyAgICAgICAgICAgIGlmIChuPCAtNTAwMDApIHJldHVybiB0aW55Kng7IAkvKnVuZGVyZmxvdyovCisJICAgIH0KKyAgICAgICAgaWYgKGs9PTB4N2ZmZikgcmV0dXJuIHgreDsJCS8qIE5hTiBvciBJbmYgKi8KKyAgICAgICAgayA9IGsrbjsKKyAgICAgICAgaWYgKGsgPj0gMHg3ZmZmKSByZXR1cm4gaHVnZSpjb3B5c2lnbmwoaHVnZSx4KTsgLyogb3ZlcmZsb3cgICovCisgICAgICAgIGlmIChrID4gMCkgCQkJCS8qIG5vcm1hbCByZXN1bHQgKi8KKwkgICAge3UuYml0cy5leHAgPSBrOyByZXR1cm4gdS5lO30KKyAgICAgICAgaWYgKGsgPD0gLTEyOCkKKyAgICAgICAgICAgIGlmIChuID4gNTAwMDApIAkvKiBpbiBjYXNlIGludGVnZXIgb3ZlcmZsb3cgaW4gbitrICovCisJCXJldHVybiBodWdlKmNvcHlzaWduKGh1Z2UseCk7CS8qb3ZlcmZsb3cqLworCSAgICBlbHNlIHJldHVybiB0aW55KmNvcHlzaWduKHRpbnkseCk7IAkvKnVuZGVyZmxvdyovCisgICAgICAgIGsgKz0gMTI4OwkJCQkvKiBzdWJub3JtYWwgcmVzdWx0ICovCisJdS5iaXRzLmV4cCA9IGs7CisgICAgICAgIHJldHVybiB1LmUqMHgxcC0xMjg7Cit9CisKK19fc3Ryb25nX3JlZmVyZW5jZShzY2FsYm5sLCBsZGV4cGwpOwpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc19zaWduYml0LmMgYi9saWJtL3NyYy9zX3NpZ25iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduYml0LmMKQEAgLTAsMCArMSw1OCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWlrZSBCYXJjcm9mdCA8bWlrZUBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaWduYml0LmMsdiAxLjEgMjAwNC8wNy8xOSAwODoxNjoxMCBkYXMgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKK2ludAorX19zaWduYml0KGRvdWJsZSBkKQoreworCXVuaW9uIElFRUVkMmJpdHMgdTsKKworCXUuZCA9IGQ7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CisKK2ludAorX19zaWduYml0ZihmbG9hdCBmKQoreworCXVuaW9uIElFRUVmMmJpdHMgdTsKKworCXUuZiA9IGY7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CisKK2ludAorX19zaWduYml0bChsb25nIGRvdWJsZSBlKQoreworCXVuaW9uIElFRUVsMmJpdHMgdTsKKworCXUuZSA9IGU7CisJcmV0dXJuICh1LmJpdHMuc2lnbik7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25nYW0uYyBiL2xpYm0vc3JjL3Nfc2lnbmdhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2Q1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpZ25nYW0uYwpAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCitpbnQgc2lnbmdhbSA9IDA7CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25pZmljYW5kLmMgYi9saWJtL3NyYy9zX3NpZ25pZmljYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiYjMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3Nfc2lnbmlmaWNhbmQuYwpAQCAtMCwwICsxLDMwIEBACisvKiBAKCMpc19zaWduaWYuYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3Nfc2lnbmlmaWNhbmQuYyx2IDEuOSAyMDAzLzA3LzIzIDA0OjUzOjQ3IHBldGVyIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogc2lnbmlmaWNhbmQoeCkgY29tcHV0ZXMganVzdAorICogCXNjYWxiKHgsIChkb3VibGUpIC1pbG9nYih4KSksCisgKiBmb3IgZXhlcmNpc2luZyB0aGUgZnJhY3Rpb24tcGFydChGKSBJRUVFIDc1NC0xOTg1IHRlc3QgdmVjdG9yLgorICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2RvdWJsZQorc2lnbmlmaWNhbmQoZG91YmxlIHgpCit7CisJcmV0dXJuIF9faWVlZTc1NF9zY2FsYih4LChkb3VibGUpIC1pbG9nYih4KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpZ25pZmljYW5kZi5jIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzNDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc19zaWduaWZpY2FuZGYuYwpAQCAtMCwwICsxLDI3IEBACisvKiBzX3NpZ25pZmljYW5kZi5jIC0tIGZsb2F0IHZlcnNpb24gb2Ygc19zaWduaWZpY2FuZC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaWduaWZpY2FuZGYuYyx2IDEuNyAyMDAyLzA1LzI4IDE4OjE1OjA0IGFsZnJlZCBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK3NpZ25pZmljYW5kZihmbG9hdCB4KQoreworCXJldHVybiBfX2llZWU3NTRfc2NhbGJmKHgsKGZsb2F0KSAtaWxvZ2JmKHgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3Nfc2luLmMgYi9saWJtL3NyYy9zX3Npbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTNlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3Npbi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIEAoIylzX3Npbi5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc19zaW4uYyx2IDEuMTAgMjAwNS8xMC8yNCAxNDowODozNiBiZGUgRXhwICQiOworI2VuZGlmCisKKy8qIHNpbih4KQorICogUmV0dXJuIHNpbmUgZnVuY3Rpb24gb2YgeC4KKyAqCisgKiBrZXJuZWwgZnVuY3Rpb246CisgKglfX2tlcm5lbF9zaW4JCS4uLiBzaW5lIGZ1bmN0aW9uIG9uIFstcGkvNCxwaS80XQorICoJX19rZXJuZWxfY29zCQkuLi4gY29zZSBmdW5jdGlvbiBvbiBbLXBpLzQscGkvNF0KKyAqCV9faWVlZTc1NF9yZW1fcGlvMgkuLi4gYXJndW1lbnQgcmVkdWN0aW9uIHJvdXRpbmUKKyAqCisgKiBNZXRob2QuCisgKiAgICAgIExldCBTLEMgYW5kIFQgZGVub3RlIHRoZSBzaW4sIGNvcyBhbmQgdGFuIHJlc3BlY3RpdmVseSBvbgorICoJWy1QSS80LCArUEkvNF0uIFJlZHVjZSB0aGUgYXJndW1lbnQgeCB0byB5MSt5MiA9IHgtaypwaS8yCisgKglpbiBbLXBpLzQgLCArcGkvNF0sIGFuZCBsZXQgbiA9IGsgbW9kIDQuCisgKglXZSBoYXZlCisgKgorICogICAgICAgICAgbiAgICAgICAgc2luKHgpICAgICAgY29zKHgpICAgICAgICB0YW4oeCkKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkgICAgMAkgICAgICAgUwkgICBDCQkgVAorICoJICAgIDEJICAgICAgIEMJICAtUwkJLTEvVAorICoJICAgIDIJICAgICAgLVMJICAtQwkJIFQKKyAqCSAgICAzCSAgICAgIC1DCSAgIFMJCS0xL1QKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU3BlY2lhbCBjYXNlczoKKyAqICAgICAgTGV0IHRyaWcgYmUgYW55IG9mIHNpbiwgY29zLCBvciB0YW4uCisgKiAgICAgIHRyaWcoKy1JTkYpICBpcyBOYU4sIHdpdGggc2lnbmFsczsKKyAqICAgICAgdHJpZyhOYU4pICAgIGlzIHRoYXQgTmFOOworICoKKyAqIEFjY3VyYWN5OgorICoJVFJJRyh4KSByZXR1cm5zIHRyaWcoeCkgbmVhcmx5IHJvdW5kZWQKKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitkb3VibGUKK3Npbihkb3VibGUgeCkKK3sKKwlkb3VibGUgeVsyXSx6PTAuMDsKKwlpbnQzMl90IG4sIGl4OworCisgICAgLyogSGlnaCB3b3JkIG9mIHguICovCisJR0VUX0hJR0hfV09SRChpeCx4KTsKKworICAgIC8qIHx4fCB+PCBwaS80ICovCisJaXggJj0gMHg3ZmZmZmZmZjsKKwlpZihpeCA8PSAweDNmZTkyMWZiKSB7CisJICAgIGlmKGl4PDB4M2U0MDAwMDApCQkJLyogfHh8IDwgMioqLTI3ICovCisJICAgICAgIHtpZigoaW50KXg9PTApIHJldHVybiB4O30JLyogZ2VuZXJhdGUgaW5leGFjdCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfc2luKHgseiwwKTsKKwl9CisKKyAgICAvKiBzaW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2ZmMDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkJY2FzZSAxOiByZXR1cm4gIF9fa2VybmVsX2Nvcyh5WzBdLHlbMV0pOworCQljYXNlIDI6IHJldHVybiAtX19rZXJuZWxfc2luKHlbMF0seVsxXSwxKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtX19rZXJuZWxfY29zKHlbMF0seVsxXSk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3NpbmYuYyBiL2xpYm0vc3JjL3Nfc2luZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzNjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy9zX3NpbmYuYwpAQCAtMCwwICsxLDgyIEBACisvKiBzX3NpbmYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfc2luLmMuCisgKiBDb252ZXJzaW9uIHRvIGZsb2F0IGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBpYW5AY3lnbnVzLmNvbS4KKyAqIE9wdGltaXplZCBieSBCcnVjZSBELiBFdmFucy4KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3NpbmYuYyx2IDEuMTQgMjAwNS8xMS8yOCAwNjoxNToxMCBiZGUgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJtYXRoLmgiCisjZGVmaW5lCUlOTElORV9LRVJORUxfQ09TREYKKyNkZWZpbmUJSU5MSU5FX0tFUk5FTF9TSU5ERgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImtfY29zZi5jIgorI2luY2x1ZGUgImtfc2luZi5jIgorCisvKiBTbWFsbCBtdWx0aXBsZXMgb2YgcGkvMiByb3VuZGVkIHRvIGRvdWJsZSBwcmVjaXNpb24uICovCitzdGF0aWMgY29uc3QgZG91YmxlCitzMXBpbzIgPSAxKk1fUElfMiwJCQkvKiAweDNGRjkyMUZCLCAweDU0NDQyRDE4ICovCitzMnBpbzIgPSAyKk1fUElfMiwJCQkvKiAweDQwMDkyMUZCLCAweDU0NDQyRDE4ICovCitzM3BpbzIgPSAzKk1fUElfMiwJCQkvKiAweDQwMTJEOTdDLCAweDdGMzMyMUQyICovCitzNHBpbzIgPSA0Kk1fUElfMjsJCQkvKiAweDQwMTkyMUZCLCAweDU0NDQyRDE4ICovCisKK2Zsb2F0CitzaW5mKGZsb2F0IHgpCit7CisJZmxvYXQgeVsyXTsKKwlpbnQzMl90IG4sIGh4LCBpeDsKKworCUdFVF9GTE9BVF9XT1JEKGh4LHgpOworCWl4ID0gaHggJiAweDdmZmZmZmZmOworCisJaWYoaXggPD0gMHgzZjQ5MGZkYSkgewkJLyogfHh8IH48PSBwaS80ICovCisJICAgIGlmKGl4PDB4Mzk4MDAwMDApCQkvKiB8eHwgPCAyKiotMTIgKi8KKwkJaWYoKChpbnQpeCk9PTApIHJldHVybiB4OwkvKiB4IHdpdGggaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3NpbmRmKHgpOworCX0KKwlpZihpeDw9MHg0MDdiNTNkMSkgewkJLyogfHh8IH48PSA1KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDAxNmNiZTMpIHsJLyogfHh8IH48PSAzcGkvNCAqLworCQlpZihoeD4wKQorCQkgICAgcmV0dXJuIF9fa2VybmVsX2Nvc2RmKHggLSBzMXBpbzIpOworCQllbHNlCisJCSAgICByZXR1cm4gLV9fa2VybmVsX2Nvc2RmKHggKyBzMXBpbzIpOworCSAgICB9IGVsc2UKKwkJcmV0dXJuIF9fa2VybmVsX3NpbmRmKChoeCA+IDAgPyBzMnBpbzIgOiAtczJwaW8yKSAtIHgpOworCX0KKwlpZihpeDw9MHg0MGUyMzFkNSkgewkJLyogfHh8IH48PSA5KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDBhZmVkZGYpIHsJLyogfHh8IH48PSA3KnBpLzQgKi8KKwkJaWYoaHg+MCkKKwkJICAgIHJldHVybiAtX19rZXJuZWxfY29zZGYoeCAtIHMzcGlvMik7CisJCWVsc2UKKwkJICAgIHJldHVybiBfX2tlcm5lbF9jb3NkZih4ICsgczNwaW8yKTsKKwkgICAgfSBlbHNlCisJCXJldHVybiBfX2tlcm5lbF9zaW5kZih4ICsgKGh4ID4gMCA/IC1zNHBpbzIgOiBzNHBpbzIpKTsKKwl9CisKKyAgICAvKiBzaW4oSW5mIG9yIE5hTikgaXMgTmFOICovCisJZWxzZSBpZiAoaXg+PTB4N2Y4MDAwMDApIHJldHVybiB4LXg7CisKKyAgICAvKiBnZW5lcmFsIGFyZ3VtZW50IHJlZHVjdGlvbiBuZWVkZWQgKi8KKwllbHNlIHsKKwkgICAgbiA9IF9faWVlZTc1NF9yZW1fcGlvMmYoeCx5KTsKKwkgICAgc3dpdGNoKG4mMykgeworCQljYXNlIDA6IHJldHVybiAgX19rZXJuZWxfc2luZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQljYXNlIDE6IHJldHVybiAgX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCQljYXNlIDI6IHJldHVybiAgX19rZXJuZWxfc2luZGYoLShkb3VibGUpeVswXS15WzFdKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtX19rZXJuZWxfY29zZGYoKGRvdWJsZSl5WzBdK3lbMV0pOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW4uYyBiL2xpYm0vc3JjL3NfdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuLmMKQEAgLTAsMCArMSw3NiBAQAorLyogQCgjKXNfdGFuLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3Rhbi5jLHYgMS4xMCAyMDA1LzExLzAyIDE0OjAxOjQ1IGJkZSBFeHAgJCI7CisjZW5kaWYKKworLyogdGFuKHgpCisgKiBSZXR1cm4gdGFuZ2VudCBmdW5jdGlvbiBvZiB4LgorICoKKyAqIGtlcm5lbCBmdW5jdGlvbjoKKyAqCV9fa2VybmVsX3RhbgkJLi4uIHRhbmdlbnQgZnVuY3Rpb24gb24gWy1waS80LHBpLzRdCisgKglfX2llZWU3NTRfcmVtX3BpbzIJLi4uIGFyZ3VtZW50IHJlZHVjdGlvbiByb3V0aW5lCisgKgorICogTWV0aG9kLgorICogICAgICBMZXQgUyxDIGFuZCBUIGRlbm90ZSB0aGUgc2luLCBjb3MgYW5kIHRhbiByZXNwZWN0aXZlbHkgb24KKyAqCVstUEkvNCwgK1BJLzRdLiBSZWR1Y2UgdGhlIGFyZ3VtZW50IHggdG8geTEreTIgPSB4LWsqcGkvMgorICoJaW4gWy1waS80ICwgK3BpLzRdLCBhbmQgbGV0IG4gPSBrIG1vZCA0LgorICoJV2UgaGF2ZQorICoKKyAqICAgICAgICAgIG4gICAgICAgIHNpbih4KSAgICAgIGNvcyh4KSAgICAgICAgdGFuKHgpCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgIDAJICAgICAgIFMJICAgQwkJIFQKKyAqCSAgICAxCSAgICAgICBDCSAgLVMJCS0xL1QKKyAqCSAgICAyCSAgICAgIC1TCSAgLUMJCSBUCisgKgkgICAgMwkgICAgICAtQwkgICBTCQktMS9UCisgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNwZWNpYWwgY2FzZXM6CisgKiAgICAgIExldCB0cmlnIGJlIGFueSBvZiBzaW4sIGNvcywgb3IgdGFuLgorICogICAgICB0cmlnKCstSU5GKSAgaXMgTmFOLCB3aXRoIHNpZ25hbHM7CisgKiAgICAgIHRyaWcoTmFOKSAgICBpcyB0aGF0IE5hTjsKKyAqCisgKiBBY2N1cmFjeToKKyAqCVRSSUcoeCkgcmV0dXJucyB0cmlnKHgpIG5lYXJseSByb3VuZGVkCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZG91YmxlCit0YW4oZG91YmxlIHgpCit7CisJZG91YmxlIHlbMl0sej0wLjA7CisJaW50MzJfdCBuLCBpeDsKKworICAgIC8qIEhpZ2ggd29yZCBvZiB4LiAqLworCUdFVF9ISUdIX1dPUkQoaXgseCk7CisKKyAgICAvKiB8eHwgfjwgcGkvNCAqLworCWl4ICY9IDB4N2ZmZmZmZmY7CisJaWYoaXggPD0gMHgzZmU5MjFmYikgeworCSAgICBpZihpeDwweDNlMzAwMDAwKQkJCS8qIHggPCAyKiotMjggKi8KKwkJaWYoKGludCl4PT0wKSByZXR1cm4geDsJCS8qIGdlbmVyYXRlIGluZXhhY3QgKi8KKwkgICAgcmV0dXJuIF9fa2VybmVsX3Rhbih4LHosMSk7CisJfQorCisgICAgLyogdGFuKEluZiBvciBOYU4pIGlzIE5hTiAqLworCWVsc2UgaWYgKGl4Pj0weDdmZjAwMDAwKSByZXR1cm4geC14OwkJLyogTmFOICovCisKKyAgICAvKiBhcmd1bWVudCByZWR1Y3Rpb24gbmVlZGVkICovCisJZWxzZSB7CisJICAgIG4gPSBfX2llZWU3NTRfcmVtX3BpbzIoeCx5KTsKKwkgICAgcmV0dXJuIF9fa2VybmVsX3Rhbih5WzBdLHlbMV0sMS0oKG4mMSk8PDEpKTsgLyogICAxIC0tIG4gZXZlbgorCQkJCQkJCS0xIC0tIG4gb2RkICovCisJfQorfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvc190YW5mLmMgYi9saWJtL3NyYy9zX3RhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW5mLmMKQEAgLTAsMCArMSw2OSBAQAorLyogc190YW5mLmMgLS0gZmxvYXQgdmVyc2lvbiBvZiBzX3Rhbi5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKiBPcHRpbWl6ZWQgYnkgQnJ1Y2UgRC4gRXZhbnMuCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW5mLmMsdiAxLjE0IDIwMDUvMTEvMjggMDU6MzU6MzIgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2RlZmluZQlJTkxJTkVfS0VSTkVMX1RBTkRGCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisjaW5jbHVkZSAia190YW5mLmMiCisKKy8qIFNtYWxsIG11bHRpcGxlcyBvZiBwaS8yIHJvdW5kZWQgdG8gZG91YmxlIHByZWNpc2lvbi4gKi8KK3N0YXRpYyBjb25zdCBkb3VibGUKK3QxcGlvMiA9IDEqTV9QSV8yLAkJCS8qIDB4M0ZGOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3QycGlvMiA9IDIqTV9QSV8yLAkJCS8qIDB4NDAwOTIxRkIsIDB4NTQ0NDJEMTggKi8KK3QzcGlvMiA9IDMqTV9QSV8yLAkJCS8qIDB4NDAxMkQ5N0MsIDB4N0YzMzIxRDIgKi8KK3Q0cGlvMiA9IDQqTV9QSV8yOwkJCS8qIDB4NDAxOTIxRkIsIDB4NTQ0NDJEMTggKi8KKworZmxvYXQKK3RhbmYoZmxvYXQgeCkKK3sKKwlmbG9hdCB5WzJdOworCWludDMyX3QgbiwgaHgsIGl4OworCisJR0VUX0ZMT0FUX1dPUkQoaHgseCk7CisJaXggPSBoeCAmIDB4N2ZmZmZmZmY7CisKKwlpZihpeCA8PSAweDNmNDkwZmRhKSB7CQkvKiB8eHwgfjw9IHBpLzQgKi8KKwkgICAgaWYoaXg8MHgzOTgwMDAwMCkJCS8qIHx4fCA8IDIqKi0xMiAqLworCQlpZigoKGludCl4KT09MCkgcmV0dXJuIHg7CS8qIHggd2l0aCBpbmV4YWN0IGlmIHggIT0gMCAqLworCSAgICByZXR1cm4gX19rZXJuZWxfdGFuZGYoeCwxKTsKKwl9CisJaWYoaXg8PTB4NDA3YjUzZDEpIHsJCS8qIHx4fCB+PD0gNSpwaS80ICovCisJICAgIGlmKGl4PD0weDQwMTZjYmUzKQkJLyogfHh8IH48PSAzcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQxcGlvMiA6IHQxcGlvMiksIC0xKTsKKwkgICAgZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQycGlvMiA6IHQycGlvMiksIDEpOworCX0KKwlpZihpeDw9MHg0MGUyMzFkNSkgewkJLyogfHh8IH48PSA5KnBpLzQgKi8KKwkgICAgaWYoaXg8PTB4NDBhZmVkZGYpCQkvKiB8eHwgfjw9IDcqcGkvNCAqLworCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQzcGlvMiA6IHQzcGlvMiksIC0xKTsKKwkgICAgZWxzZQorCQlyZXR1cm4gX19rZXJuZWxfdGFuZGYoeCArIChoeD4wID8gLXQ0cGlvMiA6IHQ0cGlvMiksIDEpOworCX0KKworICAgIC8qIHRhbihJbmYgb3IgTmFOKSBpcyBOYU4gKi8KKwllbHNlIGlmIChpeD49MHg3ZjgwMDAwMCkgcmV0dXJuIHgteDsKKworICAgIC8qIGdlbmVyYWwgYXJndW1lbnQgcmVkdWN0aW9uIG5lZWRlZCAqLworCWVsc2UgeworCSAgICBuID0gX19pZWVlNzU0X3JlbV9waW8yZih4LHkpOworCSAgICAvKiBpbnRlZ2VyIHBhcmFtZXRlcjogMSAtLSBuIGV2ZW47IC0xIC0tIG4gb2RkICovCisJICAgIHJldHVybiBfX2tlcm5lbF90YW5kZigoZG91YmxlKXlbMF0reVsxXSwxLSgobiYxKTw8MSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuaC5jIGIvbGlibS9zcmMvc190YW5oLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyOTE0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3NfdGFuaC5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIEAoIylzX3RhbmguYyA1LjEgOTMvMDkvMjQgKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCisgKiBpcyBwcmVzZXJ2ZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdGFuaC5jLHYgMS43IDIwMDIvMDUvMjggMTg6MTU6MDQgYWxmcmVkIEV4cCAkIjsKKyNlbmRpZgorCisvKiBUYW5oKHgpCisgKiBSZXR1cm4gdGhlIEh5cGVyYm9saWMgVGFuZ2VudCBvZiB4CisgKgorICogTWV0aG9kIDoKKyAqCQkJCSAgICAgICB4ICAgIC14CisgKgkJCQkgICAgICBlICAtIGUKKyAqCTAuIHRhbmgoeCkgaXMgZGVmaW5lZCB0byBiZSAtLS0tLS0tLS0tLQorICoJCQkJICAgICAgIHggICAgLXgKKyAqCQkJCSAgICAgIGUgICsgZQorICoJMS4gcmVkdWNlIHggdG8gbm9uLW5lZ2F0aXZlIGJ5IHRhbmgoLXgpID0gLXRhbmgoeCkuCisgKgkyLiAgMCAgICAgIDw9IHggPD0gMioqLTU1IDogdGFuaCh4KSA6PSB4KihvbmUreCkKKyAqCQkJCQkgICAgICAgIC10CisgKgkgICAgMioqLTU1IDwgIHggPD0gIDEgICAgIDogdGFuaCh4KSA6PSAtLS0tLTsgdCA9IGV4cG0xKC0yeCkKKyAqCQkJCQkgICAgICAgdCArIDIKKyAqCQkJCQkJICAgICAyCisgKgkgICAgMSAgICAgIDw9IHggPD0gIDIyLjAgIDogdGFuaCh4KSA6PSAxLSAgLS0tLS0gOyB0PWV4cG0xKDJ4KQorICoJCQkJCQkgICB0ICsgMgorICoJICAgIDIyLjAgICA8ICB4IDw9IElORiAgICA6IHRhbmgoeCkgOj0gMS4KKyAqCisgKiBTcGVjaWFsIGNhc2VzOgorICoJdGFuaChOYU4pIGlzIE5hTjsKKyAqCW9ubHkgdGFuaCgwKT0wIGlzIGV4YWN0IGZvciBmaW5pdGUgYXJndW1lbnQuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGRvdWJsZSBvbmU9MS4wLCB0d289Mi4wLCB0aW55ID0gMS4wZS0zMDA7CisKK2RvdWJsZQordGFuaChkb3VibGUgeCkKK3sKKwlkb3VibGUgdCx6OworCWludDMyX3QgangsaXg7CisKKyAgICAvKiBIaWdoIHdvcmQgb2YgfHh8LiAqLworCUdFVF9ISUdIX1dPUkQoangseCk7CisJaXggPSBqeCYweDdmZmZmZmZmOworCisgICAgLyogeCBpcyBJTkYgb3IgTmFOICovCisJaWYoaXg+PTB4N2ZmMDAwMDApIHsKKwkgICAgaWYgKGp4Pj0wKSByZXR1cm4gb25lL3grb25lOyAgICAvKiB0YW5oKCstaW5mKT0rLTEgKi8KKwkgICAgZWxzZSAgICAgICByZXR1cm4gb25lL3gtb25lOyAgICAvKiB0YW5oKE5hTikgPSBOYU4gKi8KKwl9CisKKyAgICAvKiB8eHwgPCAyMiAqLworCWlmIChpeCA8IDB4NDAzNjAwMDApIHsJCS8qIHx4fDwyMiAqLworCSAgICBpZiAoaXg8MHgzYzgwMDAwMCkgCQkvKiB8eHw8MioqLTU1ICovCisJCXJldHVybiB4KihvbmUreCk7ICAgIAkvKiB0YW5oKHNtYWxsKSA9IHNtYWxsICovCisJICAgIGlmIChpeD49MHgzZmYwMDAwMCkgewkvKiB8eHw+PTEgICovCisJCXQgPSBleHBtMSh0d28qZmFicyh4KSk7CisJCXogPSBvbmUgLSB0d28vKHQrdHdvKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHQgPSBleHBtMSgtdHdvKmZhYnMoeCkpOworCSAgICAgICAgej0gLXQvKHQrdHdvKTsKKwkgICAgfQorICAgIC8qIHx4fCA+IDIyLCByZXR1cm4gKy0xICovCisJfSBlbHNlIHsKKwkgICAgeiA9IG9uZSAtIHRpbnk7CQkvKiByYWlzZWQgaW5leGFjdCBmbGFnICovCisJfQorCXJldHVybiAoang+PTApPyB6OiAtejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdGFuaGYuYyBiL2xpYm0vc3JjL3NfdGFuaGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNhNmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190YW5oZi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHNfdGFuaGYuYyAtLSBmbG9hdCB2ZXJzaW9uIG9mIHNfdGFuaC5jLgorICogQ29udmVyc2lvbiB0byBmbG9hdCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgaWFuQGN5Z251cy5jb20uCisgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjaGFyIHJjc2lkW10gPSAiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190YW5oZi5jLHYgMS44IDIwMDUvMTIvMTEgMTE6NDA6NTUgYmRlIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb25lPTEuMCwgdHdvPTIuMCwgdGlueSA9IDEuMGUtMzAsIGh1Z2UgPSAxLjBlMzA7CitmbG9hdAordGFuaGYoZmxvYXQgeCkKK3sKKwlmbG9hdCB0LHo7CisJaW50MzJfdCBqeCxpeDsKKworCUdFVF9GTE9BVF9XT1JEKGp4LHgpOworCWl4ID0gangmMHg3ZmZmZmZmZjsKKworICAgIC8qIHggaXMgSU5GIG9yIE5hTiAqLworCWlmKGl4Pj0weDdmODAwMDAwKSB7CisJICAgIGlmIChqeD49MCkgcmV0dXJuIG9uZS94K29uZTsgICAgLyogdGFuaCgrLWluZik9Ky0xICovCisJICAgIGVsc2UgICAgICAgcmV0dXJuIG9uZS94LW9uZTsgICAgLyogdGFuaChOYU4pID0gTmFOICovCisJfQorCisgICAgLyogfHh8IDwgOSAqLworCWlmIChpeCA8IDB4NDExMDAwMDApIHsJCS8qIHx4fDw5ICovCisJICAgIGlmIChpeDwweDM5ODAwMDAwKSB7CS8qIHx4fDwyKiotMTIgKi8KKwkJaWYoaHVnZSt4Pm9uZSkgcmV0dXJuIHg7IC8qIHRhbmgodGlueSkgPSB0aW55IHdpdGggaW5leGFjdCAqLworCSAgICB9CisJICAgIGlmIChpeD49MHgzZjgwMDAwMCkgewkvKiB8eHw+PTEgICovCisJCXQgPSBleHBtMWYodHdvKmZhYnNmKHgpKTsKKwkJeiA9IG9uZSAtIHR3by8odCt0d28pOworCSAgICB9IGVsc2UgeworCSAgICAgICAgdCA9IGV4cG0xZigtdHdvKmZhYnNmKHgpKTsKKwkgICAgICAgIHo9IC10Lyh0K3R3byk7CisJICAgIH0KKyAgICAvKiB8eHwgPj0gOSwgcmV0dXJuICstMSAqLworCX0gZWxzZSB7CisJICAgIHogPSBvbmUgLSB0aW55OwkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJfQorCXJldHVybiAoang+PTApPyB6OiAtejsKK30KZGlmZiAtLWdpdCBhL2xpYm0vc3JjL3NfdHJ1bmMuYyBiL2xpYm0vc3JjL3NfdHJ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI4N2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuYy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0ICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKy8qIF9fRkJTRElEKCIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy9zX3RydW5jLmMsdiAxLjEgMjAwNC8wNi8yMCAwOToyNTo0MyBkYXMgRXhwICQiKTsgKi8KKworLyoKKyAqIHRydW5jKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuYyh4KS4KKyAqLworCisjaW5jbHVkZSAibWF0aC5oIgorI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGh1Z2UgPSAxLjBlMzAwOworCitkb3VibGUKK3RydW5jKGRvdWJsZSB4KQoreworCWludDMyX3QgaTAsaTEsajA7CisJdV9pbnQzMl90IGksajsKKwlFWFRSQUNUX1dPUkRTKGkwLGkxLHgpOworCWowID0gKChpMD4+MjApJjB4N2ZmKS0weDNmZjsKKwlpZihqMDwyMCkgeworCSAgICBpZihqMDwwKSB7IAkvKiByYWlzZSBpbmV4YWN0IGlmIHggIT0gMCAqLworCQlpZihodWdlK3g+MC4wKSB7LyogfHh8PDEsIHNvIHJldHVybiAwKnNpZ24oeCkgKi8KKwkJICAgIGkwICY9IDB4ODAwMDAwMDBVOworCQkgICAgaTEgPSAwOworCQl9CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDBmZmZmZik+PmowOworCQlpZigoKGkwJmkpfGkxKT09MCkgcmV0dXJuIHg7IC8qIHggaXMgaW50ZWdyYWwgKi8KKwkJaWYoaHVnZSt4PjAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJICAgIGkwICY9ICh+aSk7IGkxPTA7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoajA+NTEpIHsKKwkgICAgaWYoajA9PTB4NDAwKSByZXR1cm4geCt4OwkvKiBpbmYgb3IgTmFOICovCisJICAgIGVsc2UgcmV0dXJuIHg7CQkvKiB4IGlzIGludGVncmFsICovCisJfSBlbHNlIHsKKwkgICAgaSA9ICgodV9pbnQzMl90KSgweGZmZmZmZmZmKSk+PihqMC0yMCk7CisJICAgIGlmKChpMSZpKT09MCkgcmV0dXJuIHg7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkgICAgaWYoaHVnZSt4PjAuMCkJCS8qIHJhaXNlIGluZXhhY3QgZmxhZyAqLworCQlpMSAmPSAofmkpOworCX0KKwlJTlNFUlRfV09SRFMoeCxpMCxpMSk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RydW5jZi5jIGIvbGlibS9zcmMvc190cnVuY2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI3MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuY2YuYwpAQCAtMCwwICsxLDUzIEBACisvKiBAKCMpc19mbG9vci5jIDUuMSA5My8wOS8yNCAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoQykgMTk5MyBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgaXMgZnJlZWx5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UKKyAqIGlzIHByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisvKiBfX0ZCU0RJRCgiJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvc190cnVuY2YuYyx2IDEuMSAyMDA0LzA2LzIwIDA5OjI1OjQzIGRhcyBFeHAgJCIpOyAqLworCisvKgorICogdHJ1bmNmKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuY2YoeCkuCisgKi8KKworI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworc3RhdGljIGNvbnN0IGZsb2F0IGh1Z2UgPSAxLjBlMzBGOworCitmbG9hdAordHJ1bmNmKGZsb2F0IHgpCit7CisJaW50MzJfdCBpMCxqMDsKKwl1X2ludDMyX3QgaTsKKwlHRVRfRkxPQVRfV09SRChpMCx4KTsKKwlqMCA9ICgoaTA+PjIzKSYweGZmKS0weDdmOworCWlmKGowPDIzKSB7CisJICAgIGlmKGowPDApIHsgCS8qIHJhaXNlIGluZXhhY3QgaWYgeCAhPSAwICovCisJCWlmKGh1Z2UreD4wLjBGKQkJLyogfHh8PDEsIHNvIHJldHVybiAwKnNpZ24oeCkgKi8KKwkJICAgIGkwICY9IDB4ODAwMDAwMDA7CisJICAgIH0gZWxzZSB7CisJCWkgPSAoMHgwMDdmZmZmZik+PmowOworCQlpZigoaTAmaSk9PTApIHJldHVybiB4OyAvKiB4IGlzIGludGVncmFsICovCisJCWlmKGh1Z2UreD4wLjBGKQkJLyogcmFpc2UgaW5leGFjdCBmbGFnICovCisJCSAgICBpMCAmPSAofmkpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYoajA9PTB4ODApIHJldHVybiB4K3g7CS8qIGluZiBvciBOYU4gKi8KKwkgICAgZWxzZSByZXR1cm4geDsJCS8qIHggaXMgaW50ZWdyYWwgKi8KKwl9CisJU0VUX0ZMT0FUX1dPUkQoeCxpMCk7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy9zX3RydW5jbC5jIGIvbGlibS9zcmMvc190cnVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTkyNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibS9zcmMvc190cnVuY2wuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZQorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEZyb206IEAoIylzX2Zsb29yLmMgNS4xIDkzLzA5LzI0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3NfdHJ1bmNsLmMsdiAxLjQgMjAwNS8wNC8yOCAxOTo0NTo1NSBzdGVmYW5mIEV4cCAkIjsKKyNlbmRpZgorCisvKgorICogdHJ1bmNsKHgpCisgKiBSZXR1cm4geCByb3VuZGVkIHRvd2FyZCAwIHRvIGludGVncmFsIHZhbHVlCisgKiBNZXRob2Q6CisgKglCaXQgdHdpZGRsaW5nLgorICogRXhjZXB0aW9uOgorICoJSW5leGFjdCBmbGFnIHJhaXNlZCBpZiB4IG5vdCBlcXVhbCB0byB0cnVuY2woeCkuCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnBtYXRoLmgiCisKKyNpZmRlZiBMREJMX0lNUExJQ0lUX05CSVQKKyNkZWZpbmUJTUFOSF9TSVpFCShMREJMX01BTkhfU0laRSArIDEpCisjZWxzZQorI2RlZmluZQlNQU5IX1NJWkUJTERCTF9NQU5IX1NJWkUKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgaHVnZSA9IDEuMGUzMDA7CisKK2xvbmcgZG91YmxlCit0cnVuY2wobG9uZyBkb3VibGUgeCkKK3sKKwl1bmlvbiBJRUVFbDJiaXRzIHUgPSB7IC5lID0geCB9OworCWludCBlID0gdS5iaXRzLmV4cCAtIExEQkxfTUFYX0VYUCArIDE7CisKKwlpZiAoZSA8IE1BTkhfU0laRSAtIDEpIHsKKwkJaWYgKGUgPCAwKSB7CQkJLyogcmFpc2UgaW5leGFjdCBpZiB4ICE9IDAgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkKKwkJCQl1LmUgPSAwLjA7CisJCX0gZWxzZSB7CisJCQl1aW50NjRfdCBtID0gKCgxbGx1IDw8IE1BTkhfU0laRSkgLSAxKSA+PiAoZSArIDEpOworCQkJaWYgKCgodS5iaXRzLm1hbmggJiBtKSB8IHUuYml0cy5tYW5sKSA9PSAwKQorCQkJCXJldHVybiAoeCk7CS8qIHggaXMgaW50ZWdyYWwgKi8KKwkJCWlmIChodWdlICsgeCA+IDAuMCkgewkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCQl1LmJpdHMubWFuaCAmPSB+bTsKKwkJCQl1LmJpdHMubWFubCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGUgPCBMREJMX01BTlRfRElHIC0gMSkgeworCQl1aW50NjRfdCBtID0gKHVpbnQ2NF90KS0xID4+ICg2NCAtIExEQkxfTUFOVF9ESUcgKyBlICsgMSk7CisJCWlmICgodS5iaXRzLm1hbmwgJiBtKSA9PSAwKQorCQkJcmV0dXJuICh4KTsJLyogeCBpcyBpbnRlZ3JhbCAqLworCQlpZiAoaHVnZSArIHggPiAwLjApCQkvKiByYWlzZSBpbmV4YWN0IGZsYWcgKi8KKwkJCXUuYml0cy5tYW5sICY9IH5tOworCX0KKwlyZXR1cm4gKHUuZSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2NhYnMuYyBiL2xpYm0vc3JjL3dfY2Ficy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2U1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2NhYnMuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogY2FicygpIHdyYXBwZXIgZm9yIGh5cG90KCkuCisgKgorICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4sIDxqdGNAd2ltc2V5LmNvbT4KKyAqIFBsYWNlZCBpbnRvIHRoZSBQdWJsaWMgRG9tYWluLCAxOTk0LgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9CisgICIkRnJlZUJTRDogc3JjL2xpYi9tc3VuL3NyYy93X2NhYnMuYyx2IDEuNCAyMDAxLzA2LzEzIDE1OjE2OjMwIHJ1IEV4cCAkIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworZG91YmxlCitjYWJzKHopCisJZG91YmxlIGNvbXBsZXggejsKK3sKKwlyZXR1cm4gaHlwb3QoY3JlYWwoeiksIGNpbWFnKHopKTsKK30KKworZG91YmxlCit6X2Ficyh6KQorCWRvdWJsZSBjb21wbGV4ICp6OworeworCXJldHVybiBoeXBvdChjcmVhbCgqeiksIGNpbWFnKCp6KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2NhYnNmLmMgYi9saWJtL3NyYy93X2NhYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMTUyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYm0vc3JjL3dfY2Fic2YuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogY2Fic2YoKSB3cmFwcGVyIGZvciBoeXBvdGYoKS4KKyAqCisgKiBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgPGp0Y0B3aW1zZXkuY29tPgorICogUGxhY2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4sIDE5OTQuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KKyAgIiRGcmVlQlNEOiBzcmMvbGliL21zdW4vc3JjL3dfY2Fic2YuYyx2IDEuMyAyMDAxLzA2LzEzIDE1OjE2OjMwIHJ1IEV4cCAkIjsKKyNlbmRpZiAvKiBub3QgbGludCAqLworCisjaW5jbHVkZSA8Y29tcGxleC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJtYXRoX3ByaXZhdGUuaCIKKworZmxvYXQKK2NhYnNmKHopCisJZmxvYXQgY29tcGxleCB6OworeworCisJcmV0dXJuIGh5cG90ZihjcmVhbGYoeiksIGNpbWFnZih6KSk7Cit9CmRpZmYgLS1naXQgYS9saWJtL3NyYy93X2RyZW0uYyBiL2xpYm0vc3JjL3dfZHJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjg0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2RyZW0uYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogZHJlbSgpIHdyYXBwZXIgZm9yIHJlbWFpbmRlcigpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorCitkb3VibGUKK2RyZW0oeCwgeSkKKwlkb3VibGUgeCwgeTsKK3sKKwlyZXR1cm4gcmVtYWluZGVyKHgsIHkpOworfQpkaWZmIC0tZ2l0IGEvbGlibS9zcmMvd19kcmVtZi5jIGIvbGlibS9zcmMvd19kcmVtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2FjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJtL3NyYy93X2RyZW1mLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGRyZW1mKCkgd3JhcHBlciBmb3IgcmVtYWluZGVyZigpLgorICoKKyAqIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCA8anRjQHdpbXNleS5jb20+CisgKiBQbGFjZWQgaW50byB0aGUgUHVibGljIERvbWFpbiwgMTk5NC4KKyAqLworLyogJEZyZWVCU0Q6IHNyYy9saWIvbXN1bi9zcmMvd19kcmVtZi5jLHYgMS4zIDIwMDQvMDcvMjggMDU6NTM6MTgga2FuIEV4cCAkICovCisKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCisKK2Zsb2F0CitkcmVtZihmbG9hdCB4LCBmbG9hdCB5KQoreworCXJldHVybiByZW1haW5kZXJmKHgsIHkpOworfQo=