ZGlmZiAtLWdpdCBhL2NvbmZpZ3MvZnZwX2RlZmNmZy5jbWFrZSBiL2NvbmZpZ3MvZnZwX2RlZmNmZy5jbWFrZQppbmRleCBjYjIyYTBlLi5lZGU0NWIxIDEwMDY0NAotLS0gYS9jb25maWdzL2Z2cF9kZWZjZmcuY21ha2UKKysrIGIvY29uZmlncy9mdnBfZGVmY2ZnLmNtYWtlCkBAIC0xOCw3ICsxOCw3IEBACiAjIE1heGltdW0gbnVtYmVyIG9mIHRyYW5zbGF0aW9uIHRhYmxlcyBhbGxvY2F0ZWQgYnkgdGhlIHJ1bnRpbWUgY29udGV4dAogIyBmb3IgdGhlIHRyYW5zbGF0aW9uIGxpYnJhcnkuCiAjCi1hcm1fY29uZmlnX29wdGlvbl9vdmVycmlkZShOQU1FIFBMQVRfQ01OX0NUWF9NQVhfWExBVF9UQUJMRVMgREVGQVVMVCAxMikKK2FybV9jb25maWdfb3B0aW9uX292ZXJyaWRlKE5BTUUgUExBVF9DTU5fQ1RYX01BWF9YTEFUX1RBQkxFUyBERUZBVUxUIDEzKQogCiAjCiAjIE1heGltdW0gbnVtYmVyIG9mIGdyYW51bGVzIHN1cHBvcnRlZCwgZW5vdWdoIHRvIGNvdmVyCmRpZmYgLS1naXQgYS9kb2NzL2Rlc2lnbi9sb2NraW5nLnJzdCBiL2RvY3MvZGVzaWduL2xvY2tpbmcucnN0CmluZGV4IDExYWMwNTkuLjdhYzIxNTEgMTAwNjQ0Ci0tLSBhL2RvY3MvZGVzaWduL2xvY2tpbmcucnN0CisrKyBiL2RvY3MvZGVzaWduL2xvY2tpbmcucnN0CkBAIC01MzIsNyArNTMyLDcgQEAKIAktIERFVl9HUkFOVUxFX1NUQVRFX0RFTEVHQVRFRAogCiAjLiAqKkludGVybmFsKio6IEEgZ3JhbnVsZSBzdGF0ZSBiZWxvbmdzIHRvIHRoZSBgaW50ZXJuYWxgIGNsYXNzIGlmZiBpdCBpcyBub3QKLSAgIGFuIGBleHRlcm5hbGAuIFRoZXNlIGFyZSBvYmplY3RzIHdoaWNoIGFyZSByZWZlcmVuY2VkwqBmcm9tIGFub3RoZXIKKyAgIGFuIGBleHRlcm5hbGAuIFRoZXNlIGFyZSBvYmplY3RzIHdoaWNoIGFyZSByZWZlcmVuY2VkoGZyb20gYW5vdGhlcgogICAgb2JqZWN0IGFmdGVyIHRoYXQgb2JqZWN0IGlzIGxvY2tlZC4gRWFjaCBgaW50ZXJuYWxgIG9iamVjdCBzaG91bGQgYmUKICAgIHJlZmVyZW5jZWQgZnJvbSBleGFjdGx5IG9uZSBwbGFjZS4gVGhlIGZvbGxvd2luZyBncmFudWxlIHN0YXRlcyBhcmUKICAgIGBpbnRlcm5hbGA6CkBAIC01NDksNiArNTQ5LDkgQEAKICMuIEdyYW51bGVzIGV4cGVjdGVkIHRvIGJlIGluIGFuIGBleHRlcm5hbGAgc3RhdGUgbXVzdCBiZSBsb2NrZWQgaW4gb3JkZXIgb2YKICAgIHRoZWlyIHBoeXNpY2FsIGFkZHJlc3MsIHN0YXJ0aW5nIHdpdGggdGhlIGxvd2VzdCBhZGRyZXNzLgogCisjLiBNZW1vcnkgZ3JhbnVsZXMgZXhwZWN0ZWQgdG8gYmUgaW4gYW4gYGV4dGVybmFsYCBzdGF0ZSBtdXN0IGJlIGxvY2tlZCBiZWZvcmUKKyAgIGxvY2tpbmcgYW55IGRldmljZSBtZW1vcnkgZ3JhbnVsZXMgaW4gYGV4dGVybmFsYCBzdGF0ZS4KKwogIy4gT25jZSBhIGdyYW51bGUgZXhwZWN0ZWQgdG8gYmUgaW4gYW4gYGV4dGVybmFsYCBzdGF0ZSBoYXMgYmVlbiBsb2NrZWQsIGl0cwogICAgc3RhdGUgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGV4cGVjdGVkIHN0YXRlLiBJZiB0aGVzZSBkbyBub3QgbWF0Y2gsIHRoZQogICAgZ3JhbnVsZSBtdXN0IGJlIHVubG9ja2VkIGFuZCBubyBmdXJ0aGVyIGdyYW51bGVzIG1heSBiZSBsb2NrZWQgd2l0aGluIHRoZQpkaWZmIC0tZ2l0IGEvbGliL2FyY2gvaW5jbHVkZS9hcmNoLmggYi9saWIvYXJjaC9pbmNsdWRlL2FyY2guaAppbmRleCBlMzZmZmFiLi5jZWNkZjJhIDEwMDY0NAotLS0gYS9saWIvYXJjaC9pbmNsdWRlL2FyY2guaAorKysgYi9saWIvYXJjaC9pbmNsdWRlL2FyY2guaApAQCAtNzc4LDEzICs3NzgsMTMgQEAKICNkZWZpbmUgVlRDUl9SRVMxCQkoVUwoMSkgPDwgMzEpCiAKICNkZWZpbmUgVlRDUl9GTEFHUyAoIFwKLQlWVENSX0lSR04wX1dCUkFXQSB8IC8qIFBUVyBpbm5lciBjYWNoZSBhdHRyLiBpcyBXQiBSQVdBKi8gXAotCVZUQ1JfT1JHTjBfV0JSQVdBIHwgLyogUFRXIG91dGVyIGNhY2hlIGF0dHIuIGlzIFdCIFJBV0EqLyBcCi0JVlRDUl9TSDBfSVMgICAgICAgfCAvKiBQVFcgc2hhcmVhYmlsaXR5IGF0dHIuIGlzIE91dGVyIFNoYXJhYmxlKi9cCi0JVlRDUl9URzBfNEsgICAgICAgfCAvKiA0SyBncmFudWxlIHNpemUgaW4gbm9uLXNlY3VyZSBQVCovIFwKKwlWVENSX0lSR04wX1dCUkFXQSB8IC8qIFBUVyBpbm5lciBjYWNoZSBhdHRyLiBpcyBXQiBSQVdBICovIFwKKwlWVENSX09SR04wX1dCUkFXQSB8IC8qIFBUVyBvdXRlciBjYWNoZSBhdHRyLiBpcyBXQiBSQVdBICovIFwKKwlWVENSX1NIMF9JUyAgICAgICB8IC8qIFBUVyBzaGFyZWFiaWxpdHkgYXR0ci4gaXMgSW5uZXIgU2hhcmFibGUgKi8gXAorCVZUQ1JfVEcwXzRLICAgICAgIHwgLyogNEsgZ3JhbnVsZSBzaXplIGluIG5vbi1zZWN1cmUgUFQgKi8gXAogCS8qIFZTID0gMCAgICAgICAgICAgICAgc2l6ZShWTUlEKSA9IDggKi8gXAotCS8qIE5TVyA9IDAgICAgICAgICAgICAgbm9uLXNlY3VyZSBzMiBpcyBtYWRlIG9mIHNlY3VyZSBwYWdlcyovIFwKLQlWVENSX05TQSAgICAgICAgICAgfCAvKiBub24tc2VjdXJlIElQQSBtYXBzIHRvIG5vbi1zZWN1cmUgUEEgKi8gXAorCS8qIE5TVyA9IDAgICAgICAgICAgICAgbm9uLXNlY3VyZSBzMiBpcyBtYWRlIG9mIHNlY3VyZSBwYWdlcyAqLyBcCisJVlRDUl9OU0EJICB8IC8qIG5vbi1zZWN1cmUgSVBBIG1hcHMgdG8gbm9uLXNlY3VyZSBQQSAqLyBcCiAJVlRDUl9SRVMxIFwKIAkpCiAKZGlmZiAtLWdpdCBhL2xpYi9jb21tb24vaW5jbHVkZS9wbGF0Zm9ybV9hcGkuaCBiL2xpYi9jb21tb24vaW5jbHVkZS9wbGF0Zm9ybV9hcGkuaAppbmRleCAxYmExZmVkLi4wMjY0M2UxIDEwMDY0NAotLS0gYS9saWIvY29tbW9uL2luY2x1ZGUvcGxhdGZvcm1fYXBpLmgKKysrIGIvbGliL2NvbW1vbi9pbmNsdWRlL3BsYXRmb3JtX2FwaS5oCkBAIC0yNCw4ICsyNCw4IEBACiAgKiBUYWtlcyBhbiBhbGlnbmVkIGRldl9ncmFudWxlIGFkZHJlc3MsIHZhbGlkYXRlcyBpdCBhbmQgaWYgdmFsaWQgcmV0dXJucyB0aGUKICAqIGluZGV4IGluIHRoZSBzdHJ1Y3QgZGV2X2dyYW51bGVzIGFycmF5IG9yIFVJTlQ2NF9NQVggaW4gY2FzZSBvZiBhbiBlcnJvci4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsc28gdmFsaWRhdGVzIHRoYXQgdGhlIGRldl9ncmFudWxlIGFkZHJlc3MgaXMgYSB2YWxpZAotICogcGFnZSBhZGRyZXNzIGFuZCByZXR1cm5zIGRldmljZSBncmFudWxlIHR5cGUgaWYgdGhlIGFkZHIgaXMgdmFsaWQuCisgKiBUaGlzIGZ1bmN0aW9uIGFsc28gdmFsaWRhdGVzIHRoYXQgdGhlIGRldl9ncmFudWxlIGFkZHJlc3MgaXMgYSB2YWxpZCBwYWdlCisgKiBhZGRyZXNzIGFuZCByZXR1cm5zIGRldmljZSBncmFudWxlIGNvaGVyZW5jeSB0eXBlIGlmIHRoZSBhZGRyIGlzIHZhbGlkLgogICovCiB1bnNpZ25lZCBsb25nIHBsYXRfZGV2X2dyYW51bGVfYWRkcl90b19pZHgodW5zaWduZWQgbG9uZyBhZGRyLCBlbnVtIGRldl9jb2hfdHlwZSAqdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9ncmFudWxlL2luY2x1ZGUvZGV2X2dyYW51bGUuaCBiL2xpYi9ncmFudWxlL2luY2x1ZGUvZGV2X2dyYW51bGUuaAppbmRleCBkZThkOGNmLi5iZmM2Yjg0IDEwMDY0NAotLS0gYS9saWIvZ3JhbnVsZS9pbmNsdWRlL2Rldl9ncmFudWxlLmgKKysrIGIvbGliL2dyYW51bGUvaW5jbHVkZS9kZXZfZ3JhbnVsZS5oCkBAIC0xNzEsOCArMTcxLDggQEAKIH0KIAogLyoKLSAqIFRha2VzIGEgdmFsaWQgcG9pbnRlciB0byBhIHN0cnVjdCBkZXZfZ3JhbnVsZSwgY29ycmVzcG9uZGluZyB0byBkZXZfdHlwZQotICogYW5kIHJldHVybnMgdGhlIGRldl9ncmFudWxlIHBoeXNpY2FsIGFkZHJlc3MuCisgKiBUYWtlcyBhIHZhbGlkIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGV2X2dyYW51bGUsIGNvcnJlc3BvbmRpbmcgdG8gZGV2aWNlIG1lbW9yeQorICogY29oZXJlbmN5IHR5cGUgYW5kIHJldHVybnMgdGhlIGRldl9ncmFudWxlIHBoeXNpY2FsIGFkZHJlc3MuCiAgKgogICogVGhpcyBpcyBwdXJlbHkgYSBsb29rdXAsIGFuZCBwcm92aWRlcyBubyBndWFyYW50ZWVzIGFib3V0IHRoZSBhdHRyaWJ1dGVzIG9mCiAgKiB0aGUgZGV2X2dyYW51bGUgKGkuZS4gd2hldGhlciBpdCBpcyBsb2NrZWQsIGl0cyBzdGF0ZSBvciBpdHMgcmVmZXJlbmNlIGNvdW50KS4KQEAgLTE4MSw3ICsxODEsOCBAQAogCiAvKgogICogVGFrZXMgYW4gYWxpZ25lZCBkZXZfZ3JhbnVsZSBhZGRyZXNzLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwotICogc3RydWN0IGRldl9ncmFudWxlIGFuZCBzZXRzIGRldmljZSBncmFudWxlIHR5cGUgaW4gYWRkcmVzcyBwYXNzZWQgaW4gQHR5cGUuCisgKiBzdHJ1Y3QgZGV2X2dyYW51bGUgYW5kIHNldHMgZGV2aWNlIGdyYW51bGUgY29oZXJlbmN5IHR5cGUgaW4gYWRkcmVzcyBwYXNzZWQKKyAqIGluIEB0eXBlLgogICoKICAqIFRoaXMgaXMgcHVyZWx5IGEgbG9va3VwLCBhbmQgcHJvdmlkZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB0aGUgYXR0cmlidXRlcyBvZgogICogdGhlIGdyYW51bGUgKGkuZS4gd2hldGhlciBpdCBpcyBsb2NrZWQsIGl0cyBzdGF0ZSBvciBpdHMgcmVmZXJlbmNlIGNvdW50KS4KQEAgLTE5Nyw3ICsxOTgsNyBAQAogICoKICAqIFJldHVybnM6CiAgKiAgICAgUG9pbnRlciB0byB0aGUgc3RydWN0IGRldl9ncmFudWxlIGlmIEBhZGRyIGlzIGEgdmFsaWQgZGV2X2dyYW51bGUgcGh5c2ljYWwKLSAqICAgICBhZGRyZXNzIGFuZCBkZXZpY2UgZ3JhbnVsZSB0eXBlIGluIGFkZHJlc3MgcGFzc2VkIGluIEB0eXBlLgorICogICAgIGFkZHJlc3MgYW5kIGRldmljZSBncmFudWxlIGNvaGVyZW5jeSB0eXBlIGluIGFkZHJlc3MgcGFzc2VkIGluIEB0eXBlLgogICogICAgIE5VTEwgaWYgYW55IG9mOgogICogICAgIC0gQGFkZHIgaXMgbm90IGFsaWduZWQgdG8gdGhlIHNpemUgb2YgYSBncmFudWxlLgogICogICAgIC0gQGFkZHIgaXMgb3V0IG9mIHJhbmdlLgpAQCAtMjA3LDcgKzIwOCw3IEBACiAvKgogICogT2J0YWluIGEgcG9pbnRlciB0byBhIGxvY2tlZCBkZXZfZ3JhbnVsZSBhdCBAYWRkciBpZiBAYWRkciBpcyBhIHZhbGlkIGRldl9ncmFudWxlCiAgKiBwaHlzaWNhbCBhZGRyZXNzIGFuZCB0aGUgc3RhdGUgb2YgdGhlIGRldl9ncmFudWxlIGF0IEBhZGRyIGlzIEBleHBlY3RlZF9zdGF0ZSBhbmQKLSAqIHNldCBkZXZpY2UgZ3JhbnVsZSB0eXBlLgorICogc2V0IGRldmljZSBncmFudWxlIGNvaGVyZW5jeSB0eXBlLgogICoKICAqIFJldHVybnM6CiAgKglBIHZhbGlkIGRldl9ncmFudWxlIHBvaW50ZXIgaWYgQGFkZHIgaXMgYSB2YWxpZCBkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzCkBAIC0yMTYsMTAgKzIxNywzOCBAQAogICoJLSBAYWRkciBpcyBub3QgYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiBhIGdyYW51bGUuCiAgKgktIEBhZGRyIGlzIG91dCBvZiByYW5nZS4KICAqCS0gaWYgdGhlIHN0YXRlIG9mIHRoZSBkZXZfZ3JhbnVsZSBhdCBAYWRkciBpcyBub3QgQGV4cGVjdGVkX3N0YXRlLgorICoJVGhlIHN5c3RlbSBjb2hlcmVudCBtZW1vcnkgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIGRldl9ncmFudWxlIGlzIHJldHVybmVkIGluCisgKglAdHlwZSBvdXRwdXQgcGFyYW1ldGVyLgogICovCiBzdHJ1Y3QgZGV2X2dyYW51bGUgKmZpbmRfbG9ja19kZXZfZ3JhbnVsZSh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJCSAgdW5zaWduZWQgY2hhciBleHBlY3RlZF9zdGF0ZSwKIAkJCQkJICBlbnVtIGRldl9jb2hfdHlwZSAqdHlwZSk7CisKKy8qCisgKiBPYnRhaW4gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIEBuIGxvY2tlZCBkZXZfZ3JhbnVsZXMgYXQgQGFkZHIgaWYgQGFkZHIgaXMgYQorICogdmFsaWQgZGV2X2dyYW51bGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIHN0YXRlcyBvZiBhbGwgQG4gZGV2X2dyYW51bGVzIGluCisgKiBhcnJheSBhdCBAYWRkciBhcmUgQGV4cGVjdGVkX3N0YXRlLgorICoKKyAqIFJldHVybnM6CisgKglBIHZhbGlkIHBvaW50ZXIgdG8gdGhlIDFzdCBkZXZfZ3JhbnVsZSBpbiBhcnJheSBpZiBAYWRkciBpcyBhIHZhbGlkCisgKglkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzLgorICoJTlVMTCBpZiBhbnkgb2Y6CisgKgktIEBhZGRyIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIGEgZ3JhbnVsZS4KKyAqCS0gQGFkZHIgaXMgb3V0IG9mIHJhbmdlLgorICoJLSBpZiB0aGUgc3RhdGVzIG9mIGFsbCBkZXZfZ3JhbnVsZXMgaW4gYXJyYXkgYXQgQGFkZHIgYXJlIG5vdCBAZXhwZWN0ZWRfc3RhdGUuCisgKgktIGlmIG5vdCBhbGwgQG4gZGV2X2dyYW51bGVzIGluIGFycmF5IGhhdmUgdGhlIHNhbWUgY29oZXJlbmN5IHR5cGUuCisgKglUaGUgY29oZXJlbmN5IHR5cGUgYXNzb2NpYXRlZCB3aXRoIGRldl9ncmFudWxlcyBpcyByZXR1cm5lZCBpbgorICoJQHR5cGUgb3V0cHV0IHBhcmFtZXRlci4KKyAqCisgKiBMb2NraW5nIG9ubHkgc3VjY2VlZHMgaWYgYWxsIEBuIHRoZSBkZXZfZ3JhbnVsZXMgYXJlIGluIHRoZWlyIGV4cGVjdGVkIHN0YXRlcyBhbmQKKyAqIGhhdmUgdGhlIHNhbWUgY29oZXJlbmN5IG1lbW9yeSB0eXBlLgorICogSWYgdGhlIGZ1bmN0aW9uIGZhaWxzLCBubyBsb2NrIGlzIGhlbGQuCisgKi8KK3N0cnVjdCBkZXZfZ3JhbnVsZSAqZmluZF9sb2NrX2Rldl9ncmFudWxlcyh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGNoYXIgZXhwZWN0ZWRfc3RhdGUsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgZW51bSBkZXZfY29oX3R5cGUgKnR5cGUpOworCiAvKgogICogUmVmY291bnQgZmllbGQgb2NjdXBpZXMgTFNCIGJpdHMgb2YgdGhlIGRldl9ncmFudWxlIGRlc2NyaXB0b3IsCiAgKiBhbmQgZnVuY3Rpb25zIHdoaWNoIG1vZGlmeSBpdHMgdmFsdWUgY2FuIG9wZXJhdGUgZGlyZWN0bHkgb24KZGlmZiAtLWdpdCBhL2xpYi9ncmFudWxlL3NyYy9kZXZfZ3JhbnVsZS5jIGIvbGliL2dyYW51bGUvc3JjL2Rldl9ncmFudWxlLmMKaW5kZXggZWZlYzVjMi4uYmUwMjAzZSAxMDA2NDQKLS0tIGEvbGliL2dyYW51bGUvc3JjL2Rldl9ncmFudWxlLmMKKysrIGIvbGliL2dyYW51bGUvc3JjL2Rldl9ncmFudWxlLmMKQEAgLTE1LDE1ICsxNSwxNCBAQAogCQkJSUZfTkNCTUMoX19zZWN0aW9uKCJncmFudWxlc19tZW1vcnkiKSk7CiAKIC8qCi0gKiBUYWtlcyBhIHZhbGlkIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGV2X2dyYW51bGUsIGNvcnJlc3BvbmRpbmcgdG8gZGV2X3R5cGUKLSAqIGFuZCByZXR1cm5zIHRoZSBkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzLgorICogVGFrZXMgYSB2YWxpZCBwb2ludGVyIHRvIGEgc3RydWN0IGRldl9ncmFudWxlLCBjb3JyZXNwb25kaW5nIHRvIGRldmljZSBtZW1vcnkKKyAqIGNvaGVyZW5jeSB0eXBlIGFuZCByZXR1cm5zIHRoZSBkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzLgogICoKICAqIFRoaXMgaXMgcHVyZWx5IGEgbG9va3VwLCBhbmQgcHJvdmlkZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB0aGUgYXR0cmlidXRlcyBvZgogICogdGhlIGRldl9ncmFudWxlIChpLmUuIHdoZXRoZXIgaXQgaXMgbG9ja2VkLCBpdHMgc3RhdGUgb3IgaXRzIHJlZmVyZW5jZSBjb3VudCkuCiAgKi8KIHVuc2lnbmVkIGxvbmcgZGV2X2dyYW51bGVfYWRkcihjb25zdCBzdHJ1Y3QgZGV2X2dyYW51bGUgKmcsIGVudW0gZGV2X2NvaF90eXBlIHR5cGUpCiB7Ci0JKHZvaWQpdHlwZTsKIAl1bnNpZ25lZCBsb25nIGlkeDsKIAogCWFzc2VydChnICE9IE5VTEwpOwpAQCAtNTUsNyArNTQsOCBAQAogCiAvKgogICogVGFrZXMgYW4gYWxpZ25lZCBkZXZfZ3JhbnVsZSBhZGRyZXNzLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwotICogc3RydWN0IGRldl9ncmFudWxlIGFuZCBzZXRzIGRldmljZSBncmFudWxlIHR5cGUgaW4gYWRkcmVzcyBwYXNzZWQgaW4gQHR5cGUuCisgKiBzdHJ1Y3QgZGV2X2dyYW51bGUgYW5kIHNldHMgZGV2aWNlIGdyYW51bGUgY29oZXJlbmN5IHR5cGUgaW4gYWRkcmVzcyBwYXNzZWQKKyAqIGluIEB0eXBlLgogICoKICAqIFRoaXMgaXMgcHVyZWx5IGEgbG9va3VwLCBhbmQgcHJvdmlkZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB0aGUgYXR0cmlidXRlcyBvZgogICogdGhlIGdyYW51bGUgKGkuZS4gd2hldGhlciBpdCBpcyBsb2NrZWQsIGl0cyBzdGF0ZSBvciBpdHMgcmVmZXJlbmNlIGNvdW50KS4KQEAgLTcyLDcgKzcyLDggQEAKIAogLyoKICAqIFZlcmlmaWVzIHdoZXRoZXIgQGFkZHIgaXMgYSB2YWxpZCBkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzLCByZXR1cm5zCi0gKiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0IGRldl9ncmFudWxlIGFuZCBzZXRzIGRldmljZSBncmFudWxlIHR5cGUuCisgKiBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0IGRldl9ncmFudWxlIGFuZCBzZXRzIGRldmljZSBncmFudWxlCisgKiBjb2hlcmVuY3kgdHlwZS4KICAqCiAgKiBUaGlzIGlzIHB1cmVseSBhIGxvb2t1cCwgYW5kIHByb3ZpZGVzIG5vIGd1YXJhbnRlZXMgdy5yLnQgdGhlIHN0YXRlIG9mIHRoZQogICogZ3JhbnVsZSAoZS5nLiBsb2NraW5nKS4KQEAgLTEwMyw3ICsxMDQsNyBAQAogLyoKICAqIE9idGFpbiBhIHBvaW50ZXIgdG8gYSBsb2NrZWQgZGV2X2dyYW51bGUgYXQgQGFkZHIgaWYgQGFkZHIgaXMgYSB2YWxpZCBkZXZfZ3JhbnVsZQogICogcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIHN0YXRlIG9mIHRoZSBkZXZfZ3JhbnVsZSBhdCBAYWRkciBpcyBAZXhwZWN0ZWRfc3RhdGUgYW5kCi0gKiBzZXQgZGV2aWNlIGdyYW51bGUgdHlwZS4KKyAqIHNldCBkZXZpY2UgZ3JhbnVsZSBjb2hlcmVuY3kgdHlwZS4KICAqCiAgKiBSZXR1cm5zOgogICoJQSB2YWxpZCBkZXZfZ3JhbnVsZSBwb2ludGVyIGlmIEBhZGRyIGlzIGEgdmFsaWQgZGV2X2dyYW51bGUgcGh5c2ljYWwgYWRkcmVzcwpAQCAtMTEyLDYgKzExMyw4IEBACiAgKgktIEBhZGRyIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIGEgZ3JhbnVsZS4KICAqCS0gQGFkZHIgaXMgb3V0IG9mIHJhbmdlLgogICoJLSBpZiB0aGUgc3RhdGUgb2YgdGhlIGRldl9ncmFudWxlIGF0IEBhZGRyIGlzIG5vdCBAZXhwZWN0ZWRfc3RhdGUuCisgKglUaGUgc3lzdGVtIGNvaGVyZW50IG1lbW9yeSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggZGV2X2dyYW51bGUgaXMgcmV0dXJuZWQgaW4KKyAqCUB0eXBlIG91dHB1dCBwYXJhbWV0ZXIuCiAgKi8KIHN0cnVjdCBkZXZfZ3JhbnVsZSAqZmluZF9sb2NrX2Rldl9ncmFudWxlKHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkJICB1bnNpZ25lZCBjaGFyIGV4cGVjdGVkX3N0YXRlLApAQCAtMTI5LDMgKzEzMiw1NyBAQAogCiAJcmV0dXJuIGc7CiB9CisKKy8qCisgKiBPYnRhaW4gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIEBuIGxvY2tlZCBkZXZfZ3JhbnVsZXMgYXQgQGFkZHIgaWYgQGFkZHIgaXMgYQorICogdmFsaWQgZGV2X2dyYW51bGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIHN0YXRlcyBvZiBhbGwgQG4gZGV2X2dyYW51bGVzIGluCisgKiBhcnJheSBhdCBAYWRkciBhcmUgQGV4cGVjdGVkX3N0YXRlLgorICoKKyAqIFJldHVybnM6CisgKglBIHZhbGlkIHBvaW50ZXIgdG8gdGhlIDFzdCBkZXZfZ3JhbnVsZSBpbiBhcnJheSBpZiBAYWRkciBpcyBhIHZhbGlkCisgKglkZXZfZ3JhbnVsZSBwaHlzaWNhbCBhZGRyZXNzLgorICoJTlVMTCBpZiBhbnkgb2Y6CisgKgktIEBhZGRyIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIGEgZ3JhbnVsZS4KKyAqCS0gQGFkZHIgaXMgb3V0IG9mIHJhbmdlLgorICoJLSBpZiB0aGUgc3RhdGVzIG9mIGFsbCBkZXZfZ3JhbnVsZXMgaW4gYXJyYXkgYXQgQGFkZHIgYXJlIG5vdCBAZXhwZWN0ZWRfc3RhdGUuCisgKgktIGlmIG5vdCBhbGwgQG4gZGV2X2dyYW51bGVzIGluIGFycmF5IGhhdmUgdGhlIHNhbWUgY29oZXJlbmN5IHR5cGUuCisgKglUaGUgY29oZXJlbmN5IHR5cGUgYXNzb2NpYXRlZCB3aXRoIGRldl9ncmFudWxlcyBpcyByZXR1cm5lZCBpbgorICoJQHR5cGUgb3V0cHV0IHBhcmFtZXRlci4KKyAqCisgKiBMb2NraW5nIG9ubHkgc3VjY2VlZHMgaWYgYWxsIEBuIHRoZSBkZXZfZ3JhbnVsZXMgYXJlIGluIHRoZWlyIGV4cGVjdGVkIHN0YXRlcyBhbmQKKyAqIGhhdmUgdGhlIHNhbWUgY29oZXJlbmN5IG1lbW9yeSB0eXBlLgorICogSWYgdGhlIGZ1bmN0aW9uIGZhaWxzLCBubyBsb2NrIGlzIGhlbGQuCisgKi8KK3N0cnVjdCBkZXZfZ3JhbnVsZSAqZmluZF9sb2NrX2Rldl9ncmFudWxlcyh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGNoYXIgZXhwZWN0ZWRfc3RhdGUsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgZW51bSBkZXZfY29oX3R5cGUgKnR5cGUpCit7CisJc3RydWN0IGRldl9ncmFudWxlICpnOworCisJLyoKKwkgKiBGaW5kIGFuZCBsb2NrIHRoZSAxc3QgZGV2X2dyYW51bGUgaW4gYXJyYXkuCisJICogR2V0IGl0cyBjb2hlcmVuY3kgdHlwZS4KKwkgKi8KKwlnID0gZmluZF9sb2NrX2Rldl9ncmFudWxlKGFkZHIsIGV4cGVjdGVkX3N0YXRlLCB0eXBlKTsKKwlpZiAoZyA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAodW5zaWduZWQgbG9uZyBpID0gMVVMOyBpIDwgbjsgaSsrKSB7CisJCWVudW0gZGV2X2NvaF90eXBlIGdfdHlwZTsKKwkJc3RydWN0IGRldl9ncmFudWxlICpnX2RldjsKKworCQlhZGRyICs9IEdSQU5VTEVfU0laRTsKKworCQlnX2RldiA9IGZpbmRfbG9ja19kZXZfZ3JhbnVsZShhZGRyLCBleHBlY3RlZF9zdGF0ZSwgJmdfdHlwZSk7CisJCWlmICgoZ19kZXYgPT0gTlVMTCkgfHwgKGdfdHlwZSAhPSAqdHlwZSkpIHsKKwkJCXdoaWxlIChpICE9IDBVTCkgeworCQkJCWRldl9ncmFudWxlX3VubG9jaygmZ1stLWldKTsKKwkJCX0KKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIGc7Cit9CmRpZmYgLS1naXQgYS9saWIvZ3JhbnVsZS9zcmMvZ3JhbnVsZS5jIGIvbGliL2dyYW51bGUvc3JjL2dyYW51bGUuYwppbmRleCA2ZmYxYjY0Li43ODY5ZmNjIDEwMDY0NAotLS0gYS9saWIvZ3JhbnVsZS9zcmMvZ3JhbnVsZS5jCisrKyBiL2xpYi9ncmFudWxlL3NyYy9ncmFudWxlLmMKQEAgLTE1MCwxOCArMTUwLDE4IEBACiAvKgogICogRmluZCBhIHNldCBvZiBncmFudWxlcyBhbmQgbG9jayB0aGVtIGluIG9yZGVyIG9mIHRoZWlyIGFkZHJlc3MuCiAgKgotICogQGdyYW51bGVzOiBQb2ludGVyIHRvIGFycmF5IG9mIEBuIGl0ZW1zLiAgRWFjaCBpdGVtIG11c3QgYmUgcHJlLXBvcHVsYXRlZAorICogQGdzOgkJUG9pbnRlciB0byBhcnJheSBvZiBAbiBpdGVtcy4gRWFjaCBpdGVtIG11c3QgYmUgcHJlLXBvcHVsYXRlZAogICoJCXdpdGggLT5hZGRyIHNldCB0byB0aGUgZ3JhbnVsZSdzIGFkZHJlc3MsIGFuZCAtPnN0YXRlIHNldCB0bwogICoJCXRoZSBleHBlY3RlZCBzdGF0ZSBvZiB0aGUgZ3JhbnVsZSwgYW5kIC0+Z19yZXQgcG9pbnRpbmcgdG8KICAqCQlhIHZhbGlkICdzdHJ1Y3QgZ3JhbnVsZSAqJy4KICAqCQlUaGlzIGZ1bmN0aW9uIHNvcnRzIHRoZSBzdXBwbGllZCBhcnJheSBpbiBwbGFjZS4KLSAqIEBuOiBOdW1iZXIgb2Ygc3RydWN0IGdyYW51bGVfc2V0IGluIGFycmF5IHBvaW50ZWQgdG8gYnkgQGdyYW51bGVzCisgKiBAbjogTnVtYmVyIG9mIHN0cnVjdCBncmFudWxlX3NldCBpbiBhcnJheSBwb2ludGVkIHRvIGJ5IEBncwogICoKICAqIFJldHVybnM6Ci0gKiAgICAgVHJ1ZSBpZiBhbGwgZ3JhbnVsZXMgaW4gQGdyYW51bGVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGxvY2tlZC4KKyAqICAgICBUcnVlIGlmIGFsbCBncmFudWxlcyBpbiBAZ3Mgd2VyZSBzdWNjZXNzZnVsbHkgbG9ja2VkLgogICoKICAqICAgICBGYWxzZSBpZiBhbnkgdHdvIGVudHJpZXMgaW4gQGdyYW51bGVzIGhhdmUgdGhlIHNhbWUgLT5hZGRyLCBvcgotICogICAgIGlmLCBmb3IgYW55IGVudHJ5IGluIEBncmFudWxlcywgYW55IG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAqICAgICBpZiwgZm9yIGFueSBlbnRyeSBpbiBAZ3MsIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CiAgKiAgICAgICAtIGVudHJ5LT5hZGRyIGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIGEgZ3JhbnVsZQogICogICAgICAgLSBlbnRyeS0+YWRkciBpcyBvdXQgb2YgcmFuZ2UKICAqICAgICAgIC0gdGhlIHN0YXRlIG9mIHRoZSBncmFudWxlIGF0IGVudHJ5LT5hZGRyIGlzIG5vdCBlbnRyeS0+c3RhdGUKQEAgLTE2OSw3ICsxNjksNyBAQAogICogTG9ja2luZyBvbmx5IHN1Y2NlZWRzIGlmIHRoZSBncmFudWxlcyBhcmUgaW4gdGhlaXIgZXhwZWN0ZWQgc3RhdGVzIGFzIHBlciB0aGUKICAqIGxvY2tpbmcgcnVsZXMgaW4gZ3JhbnVsZV90eXBlcy5oLgogICoKLSAqIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgZm9yIGFsbCBpdGVtcyBpbiBAZ3JhbnVsZXMsIC0+ZyBwb2ludHMgdG8gYSBsb2NrZWQKKyAqIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgZm9yIGFsbCBpdGVtcyBpbiBAZ3MsIC0+ZyBwb2ludHMgdG8gYSBsb2NrZWQKICAqIGdyYW51bGUgaW4gLT5zdGF0ZSBhbmQgKi0+Z19yZXQgaXMgc2V0IHRvIHRoZSBwb2ludGVyIHZhbHVlLgogICoKICAqIElmIHRoZSBmdW5jdGlvbiBmYWlscywgbm8gbG9jayBpcyBoZWxkIGFuZCBubyAqLT5nX3JldCBwb2ludGVycyBhcmUKZGlmZiAtLWdpdCBhL2xpYi9zMnR0L2luY2x1ZGUvcmlwYXMuaCBiL2xpYi9zMnR0L2luY2x1ZGUvcmlwYXMuaAppbmRleCBhNDQ1NjcyLi4yZDIyZDRhIDEwMDY0NAotLS0gYS9saWIvczJ0dC9pbmNsdWRlL3JpcGFzLmgKKysrIGIvbGliL3MydHQvaW5jbHVkZS9yaXBhcy5oCkBAIC0xOCw3ICsxOCw3IEBACiAJUklQQVNfRU1QVFkgPSBSTUlfRU1QVFksCS8qIFVudXNlZCBJUEEgZm9yIFJlYWxtICovCiAJUklQQVNfUkFNID0gUk1JX1JBTSwJCS8qIElQQSB1c2VkIGZvciBDb2RlL0RhdGEgYnkgUmVhbG0gKi8KIAlSSVBBU19ERVNUUk9ZRUQgPSBSTUlfREVTVFJPWUVELC8qIElQQSBpcyBpbmFjY2Vzc2libGUgdG8gdGhlIFJlYWxtICovCi0JUklQQVNfREVWCQkJLyogQWRkcmVzcyB3aGVyZSBtZW1vcnkgb2YgYW4gYXNzaWduZWQKKwlSSVBBU19ERVYgPSBSTUlfREVWCQkvKiBJUEEgd2hlcmUgbWVtb3J5IG9mIGFuIGFzc2lnbmVkCiAJCQkJCSAgIFJlYWxtIGRldmljZSBpcyBtYXBwZWQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9zMnR0L2luY2x1ZGUvczJ0dC5oIGIvbGliL3MydHQvaW5jbHVkZS9zMnR0LmgKaW5kZXggODlhMzBmYy4uYzg5MzE2OCAxMDA2NDQKLS0tIGEvbGliL3MydHQvaW5jbHVkZS9zMnR0LmgKKysrIGIvbGliL3MydHQvaW5jbHVkZS9zMnR0LmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIFMyVFRfSAogCiAjaW5jbHVkZSA8YXJjaF9mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGRldl90eXBlLmg+CiAjaW5jbHVkZSA8Z3JhbnVsZV90eXBlcy5oPgogI2luY2x1ZGUgPG1lbW9yeS5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KQEAgLTQ5LDYgKzUwLDcgQEAKICNkZWZpbmUgUzJUVF9NSU5fU1RBUlRJTkdfTEVWRUwJCSgwKQogI2RlZmluZSBTMlRUX01JTl9TVEFSVElOR19MRVZFTF9MUEEyCSgtMSkKICNkZWZpbmUgUzJUVF9QQUdFX0xFVkVMCQkJKDMpCisjZGVmaW5lIFMyVFRfTUlOX0RFVl9CTE9DS19MRVZFTAkoMikKICNkZWZpbmUgUzJUVF9NSU5fQkxPQ0tfTEVWRUwJCSgxKQogCiAvKgpAQCAtMTEzLDYgKzExNSwxOSBAQAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHMydHRlLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhLAogCQkJCQkgICAgICBsb25nIGxldmVsKTsKK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9lbXB0eShjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCQl1bnNpZ25lZCBsb25nIHBhLCBsb25nIGxldmVsKTsKK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkJICB1bnNpZ25lZCBsb25nIHBhLCBsb25nIGxldmVsKTsKK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXYoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCk7Cit1bnNpZ25lZCBsb25nIHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXZfZGV2X2NvaF90eXBlKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCwKKwkJCQkJCSAgICAgZW51bSBkZXZfY29oX3R5cGUgdHlwZSk7Cit1bnNpZ25lZCBsb25nIHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXZfdW5jaGFuZ2VkKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyBzMnR0ZSwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyBwYSwKKwkJCQkJCSAgbG9uZyBsZXZlbCk7CiB1bnNpZ25lZCBsb25nIHMydHRlX2NyZWF0ZV90YWJsZShjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCiAJCQkJIHVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwpOwogCkBAIC0xMzgsMTEgKzE1MywxOSBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCk7CiBib29sIHMydHRlX2lzX2Fzc2lnbmVkX25zKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKIAkJCSAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCk7Ci1ib29sIHMydHRlX2lzX3RhYmxlKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKLQkJICAgIHVuc2lnbmVkIGxvbmcgczJ0dGUsIGxvbmcgbGV2ZWwpOwogYm9vbCBzMnR0ZV9pc19hc3NpZ25lZF9kZXN0cm95ZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAogCQkJCSB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKTsKIAorYm9vbCBzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZW1wdHkoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCSB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKTsKK2Jvb2wgczJ0dGVfaXNfYXNzaWduZWRfZGV2X2Rlc3Ryb3llZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCXVuc2lnbmVkIGxvbmcgczJ0dGUsIGxvbmcgbGV2ZWwpOworYm9vbCBzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZGV2KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQl1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKTsKKworYm9vbCBzMnR0ZV9pc190YWJsZShjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCSAgICB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKTsKKwogdW5zaWduZWQgbG9uZyBzMnR0ZV9wYShjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKTsKIGJvb2wgczJ0dGVfaXNfYWRkcl9sdmxfYWxpZ25lZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCkBAIC0xNzUsNiArMTk4LDEzIEBACiB2b2lkIHMydHRfaW5pdF9hc3NpZ25lZF9kZXN0cm95ZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAogCQkJCSAgdW5zaWduZWQgbG9uZyAqczJ0dCwgdW5zaWduZWQgbG9uZyBwYSwKIAkJCQkgIGxvbmcgbGV2ZWwpOwordm9pZCBzMnR0X2luaXRfYXNzaWduZWRfZGV2X2VtcHR5KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnMydHQsIHVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwpOwordm9pZCBzMnR0X2luaXRfYXNzaWduZWRfZGV2X2Rlc3Ryb3llZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnMydHQsIHVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwpOwordm9pZCBzMnR0X2luaXRfYXNzaWduZWRfZGV2X2Rldihjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJdW5zaWduZWQgbG9uZyAqczJ0dCwgdW5zaWduZWQgbG9uZyBzMnR0ZSwKKwkJCQl1bnNpZ25lZCBsb25nIHBhLCBsb25nIGxldmVsKTsKIAogdm9pZCBzMnR0X2ludmFsaWRhdGVfcGFnZShjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkIHMydHRfaW52YWxpZGF0ZV9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsIHVuc2lnbmVkIGxvbmcgYWRkcik7CkBAIC0xOTgsNiArMjI4LDEyIEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKTsKIGJvb2wgczJ0dF9tYXBzX2Fzc2lnbmVkX2Rlc3Ryb3llZF9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKTsKK2Jvb2wgczJ0dF9tYXBzX2Fzc2lnbmVkX2Rldl9lbXB0eV9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKTsKK2Jvb2wgczJ0dF9tYXBzX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWRfYmxvY2soY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkJdW5zaWduZWQgbG9uZyAqdGFibGUsIGxvbmcgbGV2ZWwpOworYm9vbCBzMnR0X21hcHNfYXNzaWduZWRfZGV2X2Rldl9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKTsKIAogc3RydWN0IHMydHRfd2FsayB7CiAJc3RydWN0IGdyYW51bGUgKmdfbGx0OwpkaWZmIC0tZ2l0IGEvbGliL3MydHQvc3JjL3MydHQuYyBiL2xpYi9zMnR0L3NyYy9zMnR0LmMKaW5kZXggNjE0OWVhZC4uNzRjNTJjOSAxMDA2NDQKLS0tIGEvbGliL3MydHQvc3JjL3MydHQuYworKysgYi9saWIvczJ0dC9zcmMvczJ0dC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGJpdG1hcC5oPgogI2luY2x1ZGUgPGJ1ZmZlci5oPgorI2luY2x1ZGUgPGRldl9ncmFudWxlLmg+CiAjaW5jbHVkZSA8Z3JhbnVsZS5oPgogI2luY2x1ZGUgPHJpcGFzLmg+CiAjaW5jbHVkZSA8czJ0dC5oPgpAQCAtMTI1LDExICsxMjYsOSBAQAogCiAvKgogICogUmV0dXJucyB0cnVlIGlmIHMydHRlIGhhcyAnb3V0cHV0IGFkZHJlc3MnIGZpZWxkLCBuYW1lbHksIGlmIGl0IGlzIG9uZSBvZjoKLSAqIC0gYXNzaWduZWRfZW1wdHkKLSAqIC0gYXNzaWduZWRfcmFtCi0gKiAtIGFzc2lnbmVkX25zCi0gKiAtIGFzc2lnbmVkX2Rlc3Ryb3llZAotICogLSB0YWJsZQorICogLSB2YWxpZCBUVEUKKyAqIC0gSElQQVMgPSBhc3NpZ25lZAorICogLSBISVBBUyA9IGFzc2lnbmVkX2RldgogICovCiBzdGF0aWMgYm9vbCBzMnR0ZV9oYXNfcGEoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAogCQkJIHVuc2lnbmVkIGxvbmcgczJ0dGUsIGxvbmcgbGV2ZWwpCkBAIC0xMzksNyArMTM4LDggQEAKIAlib29sIHZhbGlkX2Rlc2MgPSAoKHMydHRlICYgUzJUVF9ERVNDX1ZBTElEX01BU0spID09IFMyVFRFX1ZBTElEKTsKIAogCXJldHVybiAodmFsaWRfZGVzYyB8fAkvKiBibG9jaywgcGFnZSBvciB0YWJsZSAqLwotCQlzMnR0ZV9oYXNfaGlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfSElQQVNfQVNTSUdORUQpKTsKKwkJczJ0dGVfaGFzX2hpcGFzKHMydHRlLCBTMlRURV9JTlZBTElEX0hJUEFTX0FTU0lHTkVEKSB8fAorCQlzMnR0ZV9oYXNfaGlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfSElQQVNfQVNTSUdORURfREVWKSk7CiB9CiAKIC8qCkBAIC00MzMsNyArNDMzLDcgQEAKIH0KIAogLyoKLSAqIENyZWF0ZXMgYW4gaW52YWxpZCBzMnR0ZSB3aXRoIG91dHB1dCBhZGRyZXNzIEBwYSwgSElQQVM9QVNTSUdORUQgYW5kCisgKiBDcmVhdGVzIHMydHRlIHdpdGggb3V0cHV0IGFkZHJlc3MgQHBhLCBISVBBUz1BU1NJR05FRCBhbmQKICAqIFJJUEFTPUBzMnR0ZV9yaXBhcywgYXQgbGV2ZWwgQGxldmVsLgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzMnR0ZV9jcmVhdGVfYXNzaWduZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LApAQCAtNDQyLDExICs0NDIsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHR0ZTsKIAorCWFzc2VydChzMl9jdHggIT0gTlVMTCk7CiAJYXNzZXJ0KGxldmVsID49IFMyVFRfTUlOX0JMT0NLX0xFVkVMKTsKIAlhc3NlcnQobGV2ZWwgPD0gUzJUVF9QQUdFX0xFVkVMKTsKLQlhc3NlcnQoRVhUUkFDVChTMlRURV9JTlZBTElEX1JJUEFTLCBzMnR0ZV9yaXBhcykKLQkJPD0gRVhUUkFDVChTMlRURV9JTlZBTElEX1JJUEFTLCBTMlRURV9JTlZBTElEX1JJUEFTX0RFU1RST1lFRCkpOwotCWFzc2VydChzMl9jdHggIT0gTlVMTCk7CisJYXNzZXJ0KHMydHRlX3JpcGFzIDw9IFMyVFRFX0lOVkFMSURfUklQQVNfREVTVFJPWUVEKTsKIAlhc3NlcnQoczJ0dGVfaXNfYWRkcl9sdmxfYWxpZ25lZChzMl9jdHgsIHBhLCBsZXZlbCkpOwogCiAJdHRlID0gcGFfdG9fczJ0dGUocGEsIHMyX2N0eC0+ZW5hYmxlX2xwYTIpOwpAQCAtNTE0LDEwICs1MTMsMTYwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X3JpcGFzID0gczJ0dGUgJiBTMlRURV9JTlZBTElEX1JJUEFTX01BU0s7CiAKKwlhc3NlcnQoKHMydHRlICYgUzJUVF9ERVNDX1ZBTElEX01BU0spID09IFMyVFRFX0lOVkFMSUQpOworCiAJcmV0dXJuIHMydHRlX2NyZWF0ZV9hc3NpZ25lZChzMl9jdHgsIHBhLCBsZXZlbCwgY3VycmVudF9yaXBhcyk7CiB9CiAKIC8qCisgKiBDcmVhdGVzIGFuIGludmFsaWQgczJ0dGUgd2l0aCBvdXRwdXQgYWRkcmVzcyBAcGEsIEhJUEFTPUFTU0lHTkVEX0RFViBhbmQKKyAqIFJJUEFTPUBzMnR0ZV9yaXBhcywgYXQgbGV2ZWwgQGxldmVsLgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmb3IgQHMydHRlX3JpcGFzIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvCisgKiBSSVBBU19FTVBUWSBhbmQgUklQQVNfREVTVFJPWUVELgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwsCisJCQkJCQl1bnNpZ25lZCBsb25nIHMydHRlX3JpcGFzKQoreworCSh2b2lkKWxldmVsOworCXVuc2lnbmVkIGxvbmcgdHRlOworCisJYXNzZXJ0KHMyX2N0eCAhPSBOVUxMKTsKKwlhc3NlcnQobGV2ZWwgPj0gUzJUVF9NSU5fREVWX0JMT0NLX0xFVkVMKTsKKwlhc3NlcnQoKHMydHRlX3JpcGFzID09IFMyVFRFX0lOVkFMSURfUklQQVNfRU1QVFkpIHx8CisJCShzMnR0ZV9yaXBhcyA9PSBTMlRURV9JTlZBTElEX1JJUEFTX0RFU1RST1lFRCkpOworCWFzc2VydChzMnR0ZV9pc19hZGRyX2x2bF9hbGlnbmVkKHMyX2N0eCwgcGEsIGxldmVsKSk7CisKKwl0dGUgPSBwYV90b19zMnR0ZShwYSwgczJfY3R4LT5lbmFibGVfbHBhMik7CisKKwlyZXR1cm4gKHR0ZSB8IFMyVFRFX0lOVkFMSURfSElQQVNfQVNTSUdORURfREVWIHwgczJ0dGVfcmlwYXMpOworfQorCisvKgorICogQ3JlYXRlcyBhbiBpbnZhbGlkIHMydHRlIHdpdGggb3V0cHV0IGFkZHJlc3MgQHBhLCBISVBBUz1BU1NJR05FRF9ERVYKKyAqIGFuZCBSSVBBUz1FTVBUWSwgYXQgbGV2ZWwgQGxldmVsLgorICovCit1bnNpZ25lZCBsb25nIHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXZfZW1wdHkoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkJdW5zaWduZWQgbG9uZyBwYSwgbG9uZyBsZXZlbCkKK3sKKwlyZXR1cm4gczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2RldihzMl9jdHgsIHBhLCBsZXZlbCwKKwkJCQkJIFMyVFRFX0lOVkFMSURfUklQQVNfRU1QVFkpOworfQorCisvKgorICogQ3JlYXRlcyBhbiBpbnZhbGlkIHMydHRlIHdpdGggb3V0cHV0IGFkZHJlc3MgQHBhLCBISVBBUz1BU1NJR05FRF9ERVYgYW5kCisgKiBSSVBBUz1ERVNUUk9ZRUQsIGF0IGxldmVsIEBsZXZlbC4KKyAqLwordW5zaWduZWQgbG9uZyBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2X2Rlc3Ryb3llZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwpCit7CisJcmV0dXJuIHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXYoczJfY3R4LCBwYSwgbGV2ZWwsCisJCQkJCSBTMlRURV9JTlZBTElEX1JJUEFTX0RFU1RST1lFRCk7Cit9CisKKy8qCisgKiBDcmVhdGVzIGFuIGRldl9hc3NpZ25lZCBzMnR0ZSB3aXRoIG91dHB1dCBhZGRyZXNzIEBwYSBhbmQgdGhlIHNhbWUKKyAqIFJJUEFTIGFzIHBhc3NlZCBvbiBAczJ0dGUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl91bmNoYW5nZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkJICB1bnNpZ25lZCBsb25nIHMydHRlLAorCQkJCQkJICB1bnNpZ25lZCBsb25nIHBhLAorCQkJCQkJICBsb25nIGxldmVsKQoreworCXVuc2lnbmVkIGxvbmcgY3VycmVudF9yaXBhcyA9IHMydHRlICYgUzJUVEVfSU5WQUxJRF9SSVBBU19NQVNLOworCisJYXNzZXJ0KChzMnR0ZSAmIFMyVFRfREVTQ19WQUxJRF9NQVNLKSA9PSBTMlRURV9JTlZBTElEKTsKKworCXJldHVybiBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2KHMyX2N0eCwgcGEsIGxldmVsLCBjdXJyZW50X3JpcGFzKTsKK30KKworLyoKKyAqIENyZWF0ZXMgYSB2YWxpZCBhc3NpZ25lZF9kZXZfZGV2IHMydHRlIGF0IEBsZXZlbCB3aXRoIGF0dHJpYnV0ZXMgcGFzc2VkIGluCisgKiBAYXR0ci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXZfYXR0cih1bnNpZ25lZCBsb25nIHMydHRlLAorCQkJCQkJICB1bnNpZ25lZCBsb25nIGF0dHIsIGxvbmcgbGV2ZWwsCisJCQkJCQkgIGJvb2wgbHBhMikKK3sKKwl1bnNpZ25lZCBsb25nIHBhLCBuZXdfczJ0dGU7CisKKwlhc3NlcnQobGV2ZWwgPj0gUzJUVF9NSU5fREVWX0JMT0NLX0xFVkVMKTsKKworCXBhID0gczJ0dGVfdG9fcGEoczJ0dGUsIGxldmVsLCBscGEyKTsKKworCW5ld19zMnR0ZSA9IGF0dHIgfCBwYV90b19zMnR0ZShwYSwgbHBhMik7CisKKwlpZiAobGV2ZWwgPT0gUzJUVF9QQUdFX0xFVkVMKSB7CisJCXJldHVybiAobmV3X3MydHRlIHwgUzJUVEVfTDNfUEFHRSk7CisJfQorCisJcmV0dXJuIChuZXdfczJ0dGUgfCBTMlRURV9MMDEyX0JMT0NLKTsKK30KKworLyoKKyAqIENyZWF0ZXMgYSB2YWxpZCBhc3NpZ25lZF9kZXZfZGV2IHMydHRlIGF0IEBsZXZlbCB3aXRoIGF0dHJpYnV0ZXMgcGFzc2VkIGluCisgKiBAczJ0dGUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXYoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHMydHRlX21hc2sgPSAoUzJUVEVfREVWX0FUVFJTX01BU0sgfCBTMlRURV9NRU1BVFRSX01BU0spOworCXVuc2lnbmVkIGxvbmcgYXR0cjsKKwlib29sIGxwYTI7CisKKwlhc3NlcnQoczJfY3R4ICE9IE5VTEwpOworCisJbHBhMiA9IHMyX2N0eC0+ZW5hYmxlX2xwYTI7CisKKwkvKiBBZGQgU2hhcmVhYmlsaXR5IGJpdHMgaWYgRkVBVF9MUEEyIGlzIG5vdCBlbmFibGVkICovCisJaWYgKCFscGEyKSB7CisJCXMydHRlX21hc2sgfD0gUzJUVEVfU0hfTUFTSzsKKwl9CisKKwkvKiBHZXQgYXR0cmlidXRlcyAqLworCWF0dHIgPSBzMnR0ZSAmIHMydHRlX21hc2s7CisKKwlyZXR1cm4gY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXZfYXR0cihzMnR0ZSwgYXR0ciwgbGV2ZWwsIGxwYTIpOworfQorCisvKgorICogQ3JlYXRlcyBhIHZhbGlkIGFzc2lnbmVkX2Rldl9kZXYgczJ0dGUgYXQgQGxldmVsIHdpdGggYXR0cmlidXRlcyBiYXNlZCBvbgorICogZGV2aWNlIGNvaGVyZW5jeSBwYXNzZWQgaW4gQHR5cGUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXZfY29oX3R5cGUoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQkJICAgICB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsLAorCQkJCQkJICAgICBlbnVtIGRldl9jb2hfdHlwZSB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgYXR0cjsKKwlib29sIGxwYTI7CisKKwlhc3NlcnQoczJfY3R4ICE9IE5VTEwpOworCWFzc2VydCh0eXBlIDwgREVWX01FTV9NQVgpOworCisJbHBhMiA9IHMyX2N0eC0+ZW5hYmxlX2xwYTI7CisKKwlpZiAodHlwZSA9PSBERVZfTUVNX0NPSEVSRU5UKSB7CisJCS8qIENvaGVyZW50IGRldmljZSAqLworCQlhdHRyID0gUzJUVEVfREVWX0NPSF9BVFRSUzsKKworCQkvKiBBZGQgU2hhcmVhYmlsaXR5IGJpdHMgaWYgRkVBVF9MUEEyIGlzIG5vdCBlbmFibGVkICovCisJCWlmICghbHBhMikgeworCQkJYXR0ciB8PSBTMlRURV9TSF9JUzsJLyogSW5uZXIgU2hhcmVhYmxlICovCisJCX0KKwl9IGVsc2UgeworCQkvKiBOb24tY29oZXJlbnQgZGV2aWNlICovCisJCWF0dHIgPSBTMlRURV9ERVZfTkNPSF9BVFRSUzsKKworCQkvKiBBZGQgU2hhcmVhYmlsaXR5IGJpdHMgaWYgRkVBVF9MUEEyIGlzIG5vdCBlbmFibGVkICovCisJCWlmICghbHBhMikgeworCQkJYXR0ciB8PSBTMlRURV9TSF9PUzsJLyogT3V0ZXIgU2hhcmVhYmxlICovCisJCX0KKwl9CisKKwlyZXR1cm4gY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXZfYXR0cihzMnR0ZSwgYXR0ciwgbGV2ZWwsIGxwYTIpOworfQorCisvKgogICogQ3JlYXRlcyBhbiBhc3NpZ25lZF9ucyBzMnR0ZSBhdCBsZXZlbCBAbGV2ZWwuCiAgKgogICogVGhlIGZvbGxvd2luZyBTMiBUVEUgZmllbGRzIGFyZSBwcm92aWRlZCB0aHJvdWdoIEBzMnR0ZSBhcmd1bWVudDoKQEAgLTYxMSw5ICs3NjAsOCBAQAogdW5zaWduZWQgbG9uZyBzMnR0ZV9jcmVhdGVfdGFibGUoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAogCQkJCSB1bnNpZ25lZCBsb25nIHBhLCBsb25nIGxldmVsKQogewotCV9fdW51c2VkIGxvbmcgbWluX3N0YXJ0aW5nX2xldmVsOwotCiAJKHZvaWQpbGV2ZWw7CisJX191bnVzZWQgbG9uZyBtaW5fc3RhcnRpbmdfbGV2ZWw7CiAKIAlhc3NlcnQoczJfY3R4ICE9IE5VTEwpOwogCkBAIC02NTksMTEgKzgwNywyNiBAQAogc3RhdGljIGlubGluZSBib29sIHMydHRlX2hhc19hc3NpZ25lZF9yaXBhcyh1bnNpZ25lZCBsb25nIHMydHRlLAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyByaXBhcykKIHsKKwlhc3NlcnQoKHMydHRlICYgUzJUVF9ERVNDX1ZBTElEX01BU0spID09IFMyVFRFX0lOVkFMSUQpOworCWFzc2VydChyaXBhcyAhPSBTMlRURV9JTlZBTElEX1JJUEFTX1JBTSk7CisKIAlyZXR1cm4gKCgoczJ0dGUgJiBTMlRURV9JTlZBTElEX1JJUEFTX01BU0spID09IHJpcGFzKSAmJgogCQkgIHMydHRlX2hhc19oaXBhcyhzMnR0ZSwgUzJUVEVfSU5WQUxJRF9ISVBBU19BU1NJR05FRCkpOwogfQogCiAvKgorICogUmV0dXJucyB0cnVlIGlmIEBzMnR0ZSBoYXMgSElQQVM9QVNTSUdORURfREVWIGFuZCBSSVBBUz1AcmlwYXMuCisgKi8KK3N0YXRpYyBib29sIHMydHRlX2hhc19hc3NpZ25lZF9kZXZfcmlwYXModW5zaWduZWQgbG9uZyBzMnR0ZSwgdW5zaWduZWQgbG9uZyByaXBhcykKK3sKKwlhc3NlcnQoKHMydHRlICYgUzJUVF9ERVNDX1ZBTElEX01BU0spID09IFMyVFRFX0lOVkFMSUQpOworCWFzc2VydChyaXBhcyAhPSBTMlRURV9JTlZBTElEX1JJUEFTX0RFVik7CisKKwlyZXR1cm4gKChzMnR0ZSAmIFMyVFRFX0lOVkFMSURfUklQQVNfTUFTSykgPT0gcmlwYXMpICYmCisJCSBzMnR0ZV9oYXNfaGlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfSElQQVNfQVNTSUdORURfREVWKTsKK30KKworLyoKICAqIFJldHVybnMgdHJ1ZSBpZiBAczJ0dGUgaGFzIEhJUEFTPVVOQVNTSUdORUQuCiAgKi8KIGJvb2wgczJ0dGVfaXNfdW5hc3NpZ25lZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsIHVuc2lnbmVkIGxvbmcgczJ0dGUpCkBAIC03MjUsOCArODg4LDEyIEBACiBib29sIHMydHRlX2lzX2Fzc2lnbmVkX2Rlc3Ryb3llZChjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCiAJCQkJIHVuc2lnbmVkIGxvbmcgczJ0dGUsIGxvbmcgbGV2ZWwpCiB7Ci0JKHZvaWQpbGV2ZWw7CiAJKHZvaWQpczJfY3R4OworCSh2b2lkKWxldmVsOworCisJaWYgKChzMnR0ZSAmIFMyVFRfREVTQ19WQUxJRF9NQVNLKSAhPSBTMlRURV9JTlZBTElEKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlyZXR1cm4gczJ0dGVfaGFzX2Fzc2lnbmVkX3JpcGFzKHMydHRlLCBTMlRURV9JTlZBTElEX1JJUEFTX0RFU1RST1lFRCk7CiB9CkBAIC03MzcsOCArOTA0LDEyIEBACiBib29sIHMydHRlX2lzX2Fzc2lnbmVkX2VtcHR5KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBzMnR0ZSwgbG9uZyBsZXZlbCkKIHsKLQkodm9pZClsZXZlbDsKIAkodm9pZClzMl9jdHg7CisJKHZvaWQpbGV2ZWw7CisKKwlpZiAoKHMydHRlICYgUzJUVF9ERVNDX1ZBTElEX01BU0spICE9IFMyVFRFX0lOVkFMSUQpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAogCXJldHVybiBzMnR0ZV9oYXNfYXNzaWduZWRfcmlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfUklQQVNfRU1QVFkpOwogfQpAQCAtNzQ2LDkgKzkxNyw4IEBACiBzdGF0aWMgYm9vbCBzMnR0ZV9jaGVjayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsIHVuc2lnbmVkIGxvbmcgczJ0dGUsCiAJCQlsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nIG5zKQogewotCXVuc2lnbmVkIGxvbmcgZGVzY190eXBlOwotCiAJKHZvaWQpczJfY3R4OworCXVuc2lnbmVkIGxvbmcgZGVzY190eXBlOwogCiAJaWYgKChzMnR0ZSAmIFMyVFRFX05TKSAhPSBucykgewogCQlyZXR1cm4gZmFsc2U7CkBAIC03ODcsNiArOTU3LDgwIEBACiB9CiAKIC8qCisgKiBSZXR1cm5zIHRydWUgaWYgQHMydHRlIGhhcyBISVBBUz1BU1NJR05FRF9ERVYgYW5kIFJJUEFTPVJJUEFTX0RFVi4KKyAqLworYm9vbCBzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZGV2KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQl1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKQoreworCXVuc2lnbmVkIGxvbmcgYXR0cjsKKwl1bnNpZ25lZCBsb25nIGRlc2NfdHlwZSA9IHMydHRlICYgUzJUVF9ERVNDX1RZUEVfTUFTSzsKKwlib29sIGxwYTI7CisKKwlhc3NlcnQoczJfY3R4ICE9IE5VTEwpOworCisJLyogT25seSBwYWdlcyBhdCBMMyBhbmQgdmFsaWQgYmxvY2tzIGF0IEwyIGFsbG93ZWQgKi8KKwlpZiAoISgoKGxldmVsID09IFMyVFRfUEFHRV9MRVZFTCkgJiYgKGRlc2NfdHlwZSA9PSBTMlRURV9MM19QQUdFKSkgfHwKKwkgICAgICAoKGxldmVsID09IFMyVFRfTUlOX0RFVl9CTE9DS19MRVZFTCkgJiYgKGRlc2NfdHlwZSA9PSBTMlRURV9MMDEyX0JMT0NLKSkpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlhdHRyID0gczJ0dGUgJiAoUzJUVEVfREVWX0FUVFJTX01BU0sgfCBTMlRURV9NRU1BVFRSX01BU0spOworCWxwYTIgPSBzMl9jdHgtPmVuYWJsZV9scGEyOworCisJLyoKKwkgKiBDaGVjayB0aGF0IE5TLCBYTiwgUzJBUCwgQUYgYW5kIE1lbUF0dHJbMzowXSBtYXRjaCB3aXRoIHByb3ZpZGVkCisJICogYXR0cmlidXRlcy4gV2hlbiBMUEEyIGlzIG5vdCBlbmFibGVkLCBhc3NlcnQgaWYgc2hhcmVhYmlsaXR5CisJICogYXR0cnVidXRlcyBhcmUgbm90IHNldCBjb3JyZWN0bHkuCisJICovCisJaWYgKGF0dHIgPT0gUzJUVEVfREVWX0NPSF9BVFRSUykgeworCQlpZiAoIWxwYTIpIHsKKwkJCS8qIENvaGVyZW50IGRldmljZSwgSW5uZXIgU2hhcmVhYmxlICovCisJCQlhc3NlcnQoKHMydHRlICYgUzJUVEVfU0hfTUFTSykgPT0gUzJUVEVfU0hfSVMpOworCQl9CisJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoYXR0ciA9PSBTMlRURV9ERVZfTkNPSF9BVFRSUykgeworCQlpZiAoIWxwYTIpIHsKKwkJCS8qIE5vbi1jb2hlcmVudCBkZXZpY2UsIE91dGVyIFNoYXJlYWJsZSAqLworCQkJYXNzZXJ0KChzMnR0ZSAmIFMyVFRFX1NIX01BU0spID09IFMyVFRFX1NIX09TKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIEBzMnR0ZSBoYXMgSElQQVM9QVNTSUdORURfREVWIGFuZCBSSVBBUz1SSVBBU19FTVBUWS4KKyAqLworYm9vbCBzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZW1wdHkoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCSB1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKQoreworCSh2b2lkKXMyX2N0eDsKKwkodm9pZClsZXZlbDsKKworCWlmICgoczJ0dGUgJiBTMlRUX0RFU0NfVkFMSURfTUFTSykgIT0gUzJUVEVfSU5WQUxJRCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHMydHRlX2hhc19hc3NpZ25lZF9kZXZfcmlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfUklQQVNfRU1QVFkpOworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIEBzMnR0ZSBpcyBhbiBkZXZfYXNzaWduZWRfZGVzdHJveWVkLgorICovCitib29sIHMydHRlX2lzX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWQoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQl1bnNpZ25lZCBsb25nIHMydHRlLCBsb25nIGxldmVsKQoreworCSh2b2lkKXMyX2N0eDsKKwkodm9pZClsZXZlbDsKKworCWlmICgoczJ0dGUgJiBTMlRUX0RFU0NfVkFMSURfTUFTSykgIT0gUzJUVEVfSU5WQUxJRCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHMydHRlX2hhc19hc3NpZ25lZF9kZXZfcmlwYXMoczJ0dGUsIFMyVFRFX0lOVkFMSURfUklQQVNfREVTVFJPWUVEKTsKK30KKworLyoKICAqIFJldHVybnMgdHJ1ZSBpZiBAczJ0dGUgaXMgYSB0YWJsZSBhdCBsZXZlbCBAbGV2ZWwuCiAgKi8KIGJvb2wgczJ0dGVfaXNfdGFibGUoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LCB1bnNpZ25lZCBsb25nIHMydHRlLApAQCAtODQwLDExICsxMDg0LDExIEBACiB2b2lkIHMydHRfaW5pdF91bmFzc2lnbmVkX2VtcHR5KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKIAkJCQl1bnNpZ25lZCBsb25nICpzMnR0KQogewotCWFzc2VydChzMnR0ICE9IE5VTEwpOwotCiAJdW5zaWduZWQgbG9uZyBzMnR0ZSA9CiAJCXMydHRlX2NyZWF0ZV91bmFzc2lnbmVkX2VtcHR5KHMyX2N0eCk7CiAKKwlhc3NlcnQoczJ0dCAhPSBOVUxMKTsKKwogCWZvciAodW5zaWduZWQgaW50IGkgPSAwVTsgaSA8IFMyVFRFU19QRVJfUzJUVDsgaSsrKSB7CiAJCXMydHRbaV0gPSBzMnR0ZTsKIAl9CkBAIC04NjEsMTAgKzExMDUsMTAgQEAKIHZvaWQgczJ0dF9pbml0X3VuYXNzaWduZWRfcmFtKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnMydHQpCiB7Ci0JYXNzZXJ0KHMydHQgIT0gTlVMTCk7Ci0KIAl1bnNpZ25lZCBsb25nIHMydHRlID0gczJ0dGVfY3JlYXRlX3VuYXNzaWduZWRfcmFtKHMyX2N0eCk7CiAKKwlhc3NlcnQoczJ0dCAhPSBOVUxMKTsKKwogCWZvciAodW5zaWduZWQgaW50IGkgPSAwVTsgaSA8IFMyVFRFU19QRVJfUzJUVDsgaSsrKSB7CiAJCXMydHRbaV0gPSBzMnR0ZTsKIAl9CkBAIC04ODEsMTAgKzExMjUsMTAgQEAKIHZvaWQgczJ0dF9pbml0X3VuYXNzaWduZWRfbnMoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAogCQkJICAgICB1bnNpZ25lZCBsb25nICpzMnR0KQogewotCWFzc2VydChzMnR0ICE9IE5VTEwpOwotCiAJdW5zaWduZWQgbG9uZyBzMnR0ZSA9IHMydHRlX2NyZWF0ZV91bmFzc2lnbmVkX25zKHMyX2N0eCk7CiAKKwlhc3NlcnQoczJ0dCAhPSBOVUxMKTsKKwogCWZvciAodW5zaWduZWQgaW50IGkgPSAwVTsgaSA8IFMyVFRFU19QRVJfUzJUVDsgaSsrKSB7CiAJCXMydHRbaV0gPSBzMnR0ZTsKIAl9CkBAIC05MDEsMTQgKzExNDUsMTUgQEAKIHZvaWQgczJ0dF9pbml0X3VuYXNzaWduZWRfZGVzdHJveWVkKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyAqczJ0dCkKIHsKLQlhc3NlcnQoczJ0dCAhPSBOVUxMKTsKLQogCXVuc2lnbmVkIGxvbmcgczJ0dGUgPQogCQlzMnR0ZV9jcmVhdGVfdW5hc3NpZ25lZF9kZXN0cm95ZWQoczJfY3R4KTsKIAorCWFzc2VydChzMnR0ICE9IE5VTEwpOworCiAJZm9yICh1bnNpZ25lZCBpbnQgaSA9IDBVOyBpIDwgUzJUVEVTX1BFUl9TMlRUOyBpKyspIHsKIAkJczJ0dFtpXSA9IHMydHRlOwogCX0KKwogCWRzYihpc2gpOwogfQogCkBAIC0xMDE4LDYgKzEyNjMsNzggQEAKIH0KIAogLyoKKyAqIFBvcHVsYXRlcyBAczJ0dCB3aXRoIEhJUEFTPUFTU0lHTkVEX0RFViwgUklQQVM9RU1QVFkgczJ0dGVzIHRoYXQgcmVmZXIgdG8gYQorICogY29udGlndW91cyBtZW1vcnkgYmxvY2sgc3RhcnRpbmcgYXQgQHBhLCBhbmQgbWFwcGVkIGF0IGxldmVsIEBsZXZlbC4KKyAqCisgKiBUaGUgZ3JhbnVsZSBpcyBwb3B1bGF0ZWQgYmVmb3JlIGl0IGlzIG1hZGUgYSB0YWJsZSwKKyAqIGhlbmNlLCBkb24ndCB1c2UgczJ0dGVfd3JpdGUgZm9yIGFjY2Vzcy4KKyAqLwordm9pZCBzMnR0X2luaXRfYXNzaWduZWRfZGV2X2VtcHR5KGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnMydHQsIHVuc2lnbmVkIGxvbmcgcGEsIGxvbmcgbGV2ZWwpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSA9IHMydHRlX21hcF9zaXplKGxldmVsKTsKKworCWZvciAodW5zaWduZWQgaW50IGkgPSAwVTsgaSA8IFMyVFRFU19QRVJfUzJUVDsgaSsrKSB7CisJCXMydHRbaV0gPSBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2X2VtcHR5KHMyX2N0eCwgcGEsIGxldmVsKTsKKwkJcGEgKz0gbWFwX3NpemU7CisJfQorCisJZHNiKGlzaCk7Cit9CisKKy8qCisgKiBQb3B1bGF0ZXMgQHMydHQgd2l0aCBISVBBUz1BU1NJR05FRF9ERVYsIFJJUEFTPURFU1RST1lFRCBzMnR0ZXMgdGhhdCByZWZlciB0byBhCisgKiBjb250aWd1b3VzIG1lbW9yeSBibG9jayBzdGFydGluZyBhdCBAcGEsIGFuZCBtYXBwZWQgYXQgbGV2ZWwgQGxldmVsLgorICoKKyAqIFRoZSBncmFudWxlIGlzIHBvcHVsYXRlZCBiZWZvcmUgaXQgaXMgbWFkZSBhIHRhYmxlLAorICogaGVuY2UsIGRvbid0IHVzZSBzMnR0ZV93cml0ZSBmb3IgYWNjZXNzLgorICovCit2b2lkIHMydHRfaW5pdF9hc3NpZ25lZF9kZXZfZGVzdHJveWVkKGNvbnN0IHN0cnVjdCBzMnR0X2NvbnRleHQgKnMyX2N0eCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqczJ0dCwgdW5zaWduZWQgbG9uZyBwYSwgbG9uZyBsZXZlbCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIG1hcF9zaXplID0gczJ0dGVfbWFwX3NpemUobGV2ZWwpOworCisJZm9yICh1bnNpZ25lZCBpbnQgaSA9IDBVOyBpIDwgUzJUVEVTX1BFUl9TMlRUOyBpKyspIHsKKwkJczJ0dFtpXSA9IHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXZfZGVzdHJveWVkKHMyX2N0eCwgcGEsIGxldmVsKTsKKwkJcGEgKz0gbWFwX3NpemU7CisJfQorCisJZHNiKGlzaCk7Cit9CisKKy8qCisgKiBQb3B1bGF0ZXMgQHMydHQgd2l0aCBhc3NpZ25lZF9kZXZfZGV2IHMydHRlcyB0aGF0IHJlZmVyIHRvIGEKKyAqIGNvbnRpZ3VvdXMgbWVtb3J5IGJsb2NrIHN0YXJ0aW5nIGF0IEBwYSwgYW5kIG1hcHBlZCBhdCBsZXZlbCBAbGV2ZWwuCisgKgorICogVGhlIGdyYW51bGUgaXMgcG9wdWxhdGVkIGJlZm9yZSBpdCBpcyBtYWRlIGEgdGFibGUsCisgKiBoZW5jZSwgZG9uJ3QgdXNlIHMydHRlX3dyaXRlIGZvciBhY2Nlc3MuCisgKi8KK3ZvaWQgczJ0dF9pbml0X2Fzc2lnbmVkX2Rldl9kZXYoY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCXVuc2lnbmVkIGxvbmcgKnMydHQsIHVuc2lnbmVkIGxvbmcgczJ0dGUsCisJCQkJdW5zaWduZWQgbG9uZyBwYSwgbG9uZyBsZXZlbCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIG1hcF9zaXplID0gczJ0dGVfbWFwX3NpemUobGV2ZWwpOworCXVuc2lnbmVkIGxvbmcgczJ0dGVfbWFzayA9IChTMlRURV9ERVZfQVRUUlNfTUFTSyB8IFMyVFRFX01FTUFUVFJfTUFTSyk7CisKKwlhc3NlcnQoczJfY3R4ICE9IE5VTEwpOworCWFzc2VydChsZXZlbCA+PSBTMlRUX01JTl9ERVZfQkxPQ0tfTEVWRUwpOworCisJLyogQWRkIFNoYXJlYWJpbGl0eSBiaXRzIGlmIEZFQVRfTFBBMiBpcyBub3QgZW5hYmxlZCAqLworCWlmICghczJfY3R4LT5lbmFibGVfbHBhMikgeworCQlzMnR0ZV9tYXNrIHw9IFMyVFRFX1NIX01BU0s7CisJfQorCisJczJ0dGUgJj0gczJ0dGVfbWFzazsKKworCWZvciAodW5zaWduZWQgaW50IGkgPSAwVTsgaSA8IFMyVFRFU19QRVJfUzJUVDsgaSsrKSB7CisJCXMydHRbaV0gPSBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2X2RldihzMl9jdHgsIHMydHRlIHwgcGEsIGxldmVsKTsKKwkJcGEgKz0gbWFwX3NpemU7CisJfQorCisJZHNiKGlzaCk7Cit9CisKKy8qCiAgKiBSZXR1cm5zIHRydWUgaWYgczJ0dGUgaXMgYSBsaXZlIFJUVEUgZW50cnkuIGkuZS4sCiAgKiBISVBBUyBpcyBBU1NJR05FRC4KICAqCkBAIC0xMjU2LDYgKzE1NzMsMzkgQEAKIH0KIAogLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgczJ0dGVzIGFyZSBhc3NpZ25lZF9kZXZfZW1wdHkgYW5kCisgKiByZWZlciB0byBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgZ3JhbnVsZXMgYWxpZ25lZCB0byBAbGV2ZWwgLSAxLgorICovCitib29sIHMydHRfbWFwc19hc3NpZ25lZF9kZXZfZW1wdHlfYmxvY2soY29uc3Qgc3RydWN0IHMydHRfY29udGV4dCAqczJfY3R4LAorCQkJCQl1bnNpZ25lZCBsb25nICp0YWJsZSwgbG9uZyBsZXZlbCkKK3sKKwlyZXR1cm4gdGFibGVfbWFwc19ibG9jayhzMl9jdHgsIHRhYmxlLCBsZXZlbCwKKwkJCQlzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZW1wdHksIGZhbHNlKTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgczJ0dGVzIGFyZSBhc3NpZ25lZF9kZXZfZGVzdHJveWVkIGFuZAorICogcmVmZXIgdG8gYSBjb250aWd1b3VzIGJsb2NrIG9mIGdyYW51bGVzIGFsaWduZWQgdG8gQGxldmVsIC0gMS4KKyAqLworYm9vbCBzMnR0X21hcHNfYXNzaWduZWRfZGV2X2Rlc3Ryb3llZF9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKQoreworCXJldHVybiB0YWJsZV9tYXBzX2Jsb2NrKHMyX2N0eCwgdGFibGUsIGxldmVsLAorCQkJCXMydHRlX2lzX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWQsIGZhbHNlKTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgczJ0dGVzIGFyZSBhc3NpZ25lZF9kZXZfZGV2IGFuZAorICogcmVmZXIgdG8gYSBjb250aWd1b3VzIGJsb2NrIG9mIGdyYW51bGVzIGFsaWduZWQgdG8gQGxldmVsIC0gMS4KKyAqLworYm9vbCBzMnR0X21hcHNfYXNzaWduZWRfZGV2X2Rldl9ibG9jayhjb25zdCBzdHJ1Y3QgczJ0dF9jb250ZXh0ICpzMl9jdHgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCBsb25nIGxldmVsKQoreworCXJldHVybiB0YWJsZV9tYXBzX2Jsb2NrKHMyX2N0eCwgdGFibGUsIGxldmVsLAorCQkJCXMydHRlX2lzX2Fzc2lnbmVkX2Rldl9kZXYsIGZhbHNlKTsKK30KKworLyoKICAqIFNjYW4gdGhlIFJUVCBAczJ0dCAod2hpY2ggaXMgQHdpLmxldmVsKSwgZnJvbSB0aGUgZW50cnkgKEB3aS5pbmRleCkgYW5kCiAgKiBza2lwIHRoZSBub24tbGl2ZSBlbnRyaWVzIChpLmUuLCBISVBBUz1VTkFTU0lHTkVEKS4KICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc2Nhbm5pbmcgc3RvcHMgd2hlbiBhIGxpdmUgUlRURSBpcyBlbmNvdW50ZXJlZCBvciB3ZQpkaWZmIC0tZ2l0IGEvbGliL3MydHQvc3JjL3MydHRfcHZ0X2RlZnMuaCBiL2xpYi9zMnR0L3NyYy9zMnR0X3B2dF9kZWZzLmgKaW5kZXggOWY1MmVjZC4uMTUyYzIxYSAxMDA2NDQKLS0tIGEvbGliL3MydHQvc3JjL3MydHRfcHZ0X2RlZnMuaAorKysgYi9saWIvczJ0dC9zcmMvczJ0dF9wdnRfZGVmcy5oCkBAIC0xNywzNiArMTcsNDQgQEAKICAqIFJJUEFTIGFuZCBERVNDX1RZUEUgZmllbGRzIHNoYXJlIGJpdFsxXSwgYml0WzBdIHNldCB0byAxIGFwcGxpZXMgdG8gYSB2YWxpZCBkZXNjcmlwdG9yCiAgKiB3aXRoIEhJUEFTIGFuZCBSSVBBUyBmaWVsZHMgTi9BLgogICoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIHMydHRlIHR5cGUgICAgICAgICAgIGxldmVsIE5TWzU1XSBISVBBU1s1OjNdICAgIFJJUEFTWzI6MV0gICBERVNDX1RZUEVbMTowXSBPQSBhbGlnbm1lbnQKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIHVuYXNzaWduZWRfZW1wdHkgICAgIGFueSAgIDAgICAgICB1bmFzc2lnbmVkWzBdIGVtcHR5WzBdICAgICBpbnZhbGlkWzBdICAgICBuL2EKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHVuYXNzaWduZWRfcmFtICAgICAgIGFueSAgIDAgICAgICB1bmFzc2lnbmVkWzBdIHJhbVsxXSAgICAgICBpbnZhbGlkWzJdICAgICBuL2EKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHVuYXNzaWduZWRfZGVzdHJveWVkIGFueSAgIDAgICAgICB1bmFzc2lnbmVkWzBdIGRlc3Ryb3llZFsyXSBpbnZhbGlkWzBdICAgICBuL2EKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGFzc2lnbmVkX2VtcHR5ICAgICAgIDIsMyAgIDAgICAgICBhc3NpZ25lZFsxXSAgIGVtcHR5WzBdICAgICBpbnZhbGlkWzBdICAgICB0byBsZXZlbAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogYXNzaWduZWRfcmFtICAgICAgICAgMyAgICAgMCAgICAgIG4vYSAgICAgICAgICAgbi9hICAgICAgICAgIHBhZ2VbM10gICAgICAgIHRvIGxldmVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAyICAgICAwICAgICAgbi9hICAgICAgICAgICBuL2EgICAgICAgICAgYmxvY2tbMV0gICAgICAgdG8gbGV2ZWwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGFzc2lnbmVkX2Rlc3Ryb3llZCAgIGFueSAgIDAgICAgICBhc3NpZ25lZFsxXSAgIGRlc3Ryb3llZFsyXSBpbnZhbGlkWzBdICAgICBuL2EKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIHVuYXNzaWduZWRfbnMgICAgICAgIGFueSAgIDEgICAgICB1bmFzc2lnbmVkWzBdIG4vYSAgICAgICAgICBpbnZhbGlkWzBdICAgICBuL2EKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGFzc2lnbmVkX25zCSAgICAgICAgMyAgICAgMSAgICAgIG4vYSAgICAgICAgICAgbi9hICAgICAgICAgIHBhZ2VbM10gICAgICAgIHRvIGxldmVsCi0gKiAgICAgICAgICAgICAgICAgICAgICAyICAgICAxICAgICAgbi9hICAgICAgICAgICBuL2EgICAgICAgICAgYmxvY2tbMV0gICAgICAgdG8gbGV2ZWwKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIHRhYmxlICAgICAgICAgICAgICA8PTIgICAgIG4vYSAgICBuL2EgICAgICAgICAgIG4vYSAgICAgICAgICB0YWJsZVszXSAgICAgICB0byA0S0IKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHMydHRlIHR5cGUgICAgICAgICAgICBsZXZlbCBOU1s1NV0gSElQQVNbNTozXSAgICAgIFJJUEFTWzI6MV0gICBERVNDX1RZUEVbMTowXSBPQSBhbGlnbm1lbnQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdW5hc3NpZ25lZF9lbXB0eSAgICAgICBhbnkgICAwICAgICB1bmFzc2lnbmVkWzBdICAgZW1wdHlbMF0gICAgIGludmFsaWRbMF0gICAgIG4vYQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB1bmFzc2lnbmVkX3JhbSAgICAgICAgIGFueSAgIDAgICAgIHVuYXNzaWduZWRbMF0gICByYW1bMV0gICAgICAgaW52YWxpZFsyXSAgICAgbi9hCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVuYXNzaWduZWRfZGVzdHJveWVkICAgYW55ICAgMCAgICAgdW5hc3NpZ25lZFswXSAgIGRlc3Ryb3llZFsyXSBpbnZhbGlkWzBdICAgICBuL2EKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYXNzaWduZWRfZW1wdHkgICAgICAgICAyLDMgICAwICAgICBhc3NpZ25lZFsxXSAgICAgZW1wdHlbMF0gICAgIGludmFsaWRbMF0gICAgIHRvIGxldmVsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFzc2lnbmVkX3JhbSAgICAgICAgICAgMyAgICAgMCAgICAgbi9hICAgICAgICAgICAgIG4vYSAgICAgICAgICBwYWdlWzNdICAgICAgICB0byBsZXZlbAorICogICAgICAgICAgICAgICAgICAgICAgICAyICAgICAwICAgICBuL2EgICAgICAgICAgICAgbi9hICAgICAgICAgIGJsb2NrWzFdICAgICAgIHRvIGxldmVsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFzc2lnbmVkX2Rlc3Ryb3llZCAgICAgYW55ICAgMCAgICAgYXNzaWduZWRbMV0gICAgIGRlc3Ryb3llZFsyXSBpbnZhbGlkWzBdICAgICBuL2EKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYXNzaWduZWRfZGV2X2VtcHR5ICAgICBhbnkgICAwICAgICBhc3NpZ25lZF9kZXZbM10gZW1wdHlbMF0gICAgIGludmFsaWRbMF0gICAgIHRvIGxldmVsCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFzc2lnbmVkX2Rldl9kZXN0cm95ZWQgYW55ICAgMCAgICAgYXNzaWduZWRfZGV2WzNdIGRlc3Ryb3llZFsyXSBpbnZhbGlkWzBdICAgICB0byBsZXZlbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBhc3NpZ25lZF9kZXZfZGV2ICAgICAgIDMgICAgIDAgICAgIG4vYSAgICAgICAgICAgICBuL2EgICAgICAgICAgcGFnZVszXSAgICAgICAgdG8gbGV2ZWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgMCAgICAgbi9hICAgICAgICAgICAgIG4vYSAgICAgICAgICBibG9ja1sxXSAgICAgICB0byBsZXZlbAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB1bmFzc2lnbmVkX25zICAgICAgICAgIGFueSAgIDEgICAgIHVuYXNzaWduZWRbMF0gICBuL2EgICAgICAgICAgaW52YWxpZFswXSAgICAgbi9hCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGFzc2lnbmVkX25zCSAgICAgICAgICAzICAgICAxICAgICBuL2EgICAgICAgICAgICAgbi9hICAgICAgICAgIHBhZ2VbM10gICAgICAgIHRvIGxldmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgIDEgICAgIG4vYSAgICAgICAgICAgICBuL2EgICAgICAgICAgYmxvY2tbMV0gICAgICAgdG8gbGV2ZWwKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdGFibGUgICAgICAgICAgICAgICAgPD0yICAgIG4vYSAgICBuL2EgICAgICAgICAgICAgbi9hICAgICAgICAgIHRhYmxlWzNdICAgICAgIHRvIDRLQgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KICNkZWZpbmUgUzJUVEVfSU5WQUxJRF9ISVBBU19TSElGVAk1CiAjZGVmaW5lIFMyVFRFX0lOVkFMSURfSElQQVNfV0lEVEgJM1UKICNkZWZpbmUgUzJUVEVfSU5WQUxJRF9ISVBBU19NQVNLCU1BU0soUzJUVEVfSU5WQUxJRF9ISVBBUykKIAotI2RlZmluZSBTMlRURV9JTlZBTElEX0hJUEFTX1VOQVNTSUdORUQJKElOUExBQ0UoUzJUVEVfSU5WQUxJRF9ISVBBUywgUk1JX1VOQVNTSUdORUQpKQotI2RlZmluZSBTMlRURV9JTlZBTElEX0hJUEFTX0FTU0lHTkVECShJTlBMQUNFKFMyVFRFX0lOVkFMSURfSElQQVMsIFJNSV9BU1NJR05FRCkpCisjZGVmaW5lIFMyVFRFX0lOVkFMSURfSElQQVNfVU5BU1NJR05FRAkJKElOUExBQ0UoUzJUVEVfSU5WQUxJRF9ISVBBUywgUk1JX1VOQVNTSUdORUQpKQorI2RlZmluZSBTMlRURV9JTlZBTElEX0hJUEFTX0FTU0lHTkVECQkoSU5QTEFDRShTMlRURV9JTlZBTElEX0hJUEFTLCBSTUlfQVNTSUdORUQpKQorI2RlZmluZSBTMlRURV9JTlZBTElEX0hJUEFTX0FTU0lHTkVEX0RFVgkoSU5QTEFDRShTMlRURV9JTlZBTElEX0hJUEFTLCBSTUlfQVNTSUdORURfREVWKSkKIAogI2RlZmluZSBTMlRURV9JTlZBTElEX1JJUEFTX1NISUZUCTEKICNkZWZpbmUgUzJUVEVfSU5WQUxJRF9SSVBBU19XSURUSAkyVQpAQCAtNTUsNiArNjMsNyBAQAogI2RlZmluZSBTMlRURV9JTlZBTElEX1JJUEFTX0VNUFRZCShJTlBMQUNFKFMyVFRFX0lOVkFMSURfUklQQVMsIFJNSV9FTVBUWSkpCiAjZGVmaW5lIFMyVFRFX0lOVkFMSURfUklQQVNfUkFNCQkoSU5QTEFDRShTMlRURV9JTlZBTElEX1JJUEFTLCBSTUlfUkFNKSkKICNkZWZpbmUgUzJUVEVfSU5WQUxJRF9SSVBBU19ERVNUUk9ZRUQJKElOUExBQ0UoUzJUVEVfSU5WQUxJRF9SSVBBUywgUk1JX0RFU1RST1lFRCkpCisjZGVmaW5lIFMyVFRFX0lOVkFMSURfUklQQVNfREVWCQkoSU5QTEFDRShTMlRURV9JTlZBTElEX1JJUEFTLCBSTUlfREVWKSkKIAogI2RlZmluZSBTMlRURV9OUwkJCSgxVUwgPDwgNTUpCiAjZGVmaW5lIFMyVFRFX0FGCQkJKDFVTCA8PCAxMCkKQEAgLTEwMSw3ICsxMTAsOSBAQAogICovCiAjZGVmaW5lIFMyVFRFX01FTUFUVFJfU0hJRlQJCTIKICNkZWZpbmUgUzJUVEVfTUVNQVRUUl9NQVNLCQkoMHg3VUwgPDwgUzJUVEVfTUVNQVRUUl9TSElGVCkKKyNkZWZpbmUgUzJUVEVfTUVNQVRUUl9GV0JfTkMJCSgoMVVMIDw8IDQpIHwgKDFVTCA8PCAyKSkKICNkZWZpbmUgUzJUVEVfTUVNQVRUUl9GV0JfTk9STUFMX1dCCSgoMVVMIDw8IDQpIHwgKDJVTCA8PCAyKSkKKyNkZWZpbmUgUzJUVEVfTUVNQVRUUl9ERVZfQ09ICQkoKDFVTCA8PCA0KSB8ICgzVUwgPDwgMikpCiAjZGVmaW5lIFMyVFRFX01FTUFUVFJfRldCX1JFU0VSVkVECSgoMVVMIDw8IDQpIHwgKDBVTCA8PCAyKSkKIAogI2RlZmluZSBTMlRURV9BUF9TSElGVAkJCTYKQEAgLTEyNSw2ICsxMzYsMTIgQEAKICNkZWZpbmUgUzJUVEVfQVRUUlMJCShTMlRURV9BVFRSU19MUEEyIHwgUzJUVEVfU0hfSVMpCiAjZGVmaW5lIFMyVFRFX0FUVFJTX01BU0sJKFMyVFRFX0FUVFJTX0xQQTJfTUFTSyB8IFMyVFRFX1NIX01BU0spCiAKKyNkZWZpbmUgUzJUVEVfREVWX0FUVFJTCQkoUzJUVEVfQVBfUlcgfCBTMlRURV9BRiB8IFMyVFRFX1hOKQorI2RlZmluZSBTMlRURV9ERVZfQVRUUlNfTUFTSwkoUzJUVEVfTlMgfCBTMlRURV9BUF9NQVNLIHwgUzJUVEVfQUYgfCBTMlRURV9YTikKKworI2RlZmluZSBTMlRURV9ERVZfQ09IX0FUVFJTCShTMlRURV9ERVZfQVRUUlMgfCBTMlRURV9NRU1BVFRSX0RFVl9DT0gpCisjZGVmaW5lIFMyVFRFX0RFVl9OQ09IX0FUVFJTCShTMlRURV9ERVZfQVRUUlMgfCBTMlRURV9NRU1BVFRSX0ZXQl9OQykKKwogLyogTlMgYXR0cmlidXRlcyBjb250cm9sbGVkIGJ5IHRoZSBob3N0ICovCiAjZGVmaW5lIFMyVFRFX05TX0FUVFJfTUFTSwkoUzJUVEVfTUVNQVRUUl9NQVNLIHwgUzJUVEVfQVBfTUFTSykKIApAQCAtMTQwLDYgKzE1Nyw3IEBACiAjZGVmaW5lIFMyVFRFX0JMT0NLX0xQQTIJKFMyVFRFX0FUVFJTX0xQQTIgfCBTMlRURV9MMDEyX0JMT0NLKQogI2RlZmluZSBTMlRURV9QQUdFCQkoUzJUVEVfQVRUUlMgfCBTMlRURV9MM19QQUdFKQogI2RlZmluZSBTMlRURV9QQUdFX0xQQTIJCShTMlRURV9BVFRSU19MUEEyIHwgUzJUVEVfTDNfUEFHRSkKKwogI2RlZmluZSBTMlRURV9CTE9DS19OUwkJKChTMlRURV9OU19BVFRSX1JNTSkgfCBTMlRURV9MMDEyX0JMT0NLKQogI2RlZmluZSBTMlRURV9QQUdFX05TCQkoKFMyVFRFX05TX0FUVFJfUk1NKSB8IFMyVFRFX0wzX1BBR0UpCiAjZGVmaW5lIFMyVFRFX0lOVkFMSUQJCVMyVFRFX0x4X0lOVkFMSUQKZGlmZiAtLWdpdCBhL2xpYi9zbWMvaW5jbHVkZS9zbWMtcm1pLmggYi9saWIvc21jL2luY2x1ZGUvc21jLXJtaS5oCmluZGV4IGNmZGQ0NzMuLmZmNDYzZjIgMTAwNjQ0Ci0tLSBhL2xpYi9zbWMvaW5jbHVkZS9zbWMtcm1pLmgKKysrIGIvbGliL3NtYy9pbmNsdWRlL3NtYy1ybWkuaApAQCAtMTI0LDYgKzEyNCw3IEBACiAjZGVmaW5lIFJNSV9VTkFTU0lHTkVECQlVTCgwKQogI2RlZmluZSBSTUlfQVNTSUdORUQJCVVMKDEpCiAjZGVmaW5lIFJNSV9UQUJMRQkJVUwoMikKKyNkZWZpbmUgUk1JX0FTU0lHTkVEX0RFVglVTCgzKQogCiAvKiBSbWlGZWF0dXJlIGVudW1lcmF0aW9ucyAqLwogI2RlZmluZSBSTUlfRkVBVFVSRV9GQUxTRQlVTCgwKQpAQCAtMTg4LDggKzE4OSw4IEBACiAvKiBBZGRyZXNzIHdoaWNoIGlzIGluYWNjZXNzaWJsZSB0byB0aGUgUmVhbG0gZHVlIHRvIGFuIGFjdGlvbiB0YWtlbiBieSB0aGUgSG9zdCAqLwogI2RlZmluZSBSTUlfREVTVFJPWUVECVVMKDIpCiAKLS8qIEFkZHJlc3Mgd2hlcmUgTU1JTyBvZiBhbiBhc3NpZ25lZCBSZWFsbSBkZXZpY2UgaXMgbWFwcGVkLiAqLwotI2RlZmluZSBSTUlfSU8JCVVMKDMpCisvKiBBZGRyZXNzIHdoZXJlIG1lbW9yeSBvZiBhbiBhc3NpZ25lZCBSZWFsbSBkZXZpY2UgaXMgbWFwcGVkICovCisjZGVmaW5lIFJNSV9ERVYJCVVMKDMpCiAKIC8qIFJtaVBtdU92ZXJmbG93U3RhdHVzIGVudW1lcmF0aW9uIHJlcHJlc2VudGluZyBQTVUgb3ZlcmZsb3cgc3RhdHVzICovCiAjZGVmaW5lIFJNSV9QTVVfT1ZFUkZMT1dfTk9UX0FDVElWRQlVKDApCkBAIC0zNzUsNiArMzc2LDkgQEAKICAqIGFyZzAgPT0gUkQgYWRkcmVzcwogICogYXJnMSA9PSBtYXAgYWRkcmVzcwogICogYXJnMiA9PSBsZXZlbAorICoKKyAqIHJldDEgPT0gVG9wIG9mIHRoZSBub24tbGl2ZSBhZGRyZXNzIHJlZ2lvbi4gT25seSB2YWxpZAorICogICAgICAgICBpZiByZXQwID09IFJNSV9TVUNDRVNTIG9yIHJldDAgPT0gKFJNSV9FUlJPUl9SVFQsIHgpCiAgKi8KICNkZWZpbmUgU01DX1JNSV9SVFRfVU5NQVBfVU5QUk9URUNURUQJCVNNQzY0X1JNSV9GSUQoVSgweDEyKSkKIApAQCAtNDQyLDEzICs0NDYsMjcgQEAKIAogLyoKICAqIEZJRDogMHhDNDAwMDE3MgorICoKKyAqIGFyZzAgPT0gUkQgYWRkcmVzcworICogYXJnMSA9PSBtYXAgYWRkcmVzcworICogYXJnMiA9PSBsZXZlbAorICogYXJnMyA9PSBQQSBvZiB0aGUgdGFyZ2V0IGRldmljZSBtZW1vcnkKICAqLwotI2RlZmluZSBTTUNfUk1JX0RFVl9NQVAJCQkJU01DNjRfUk1JX0ZJRChVKDB4MjIpKQorI2RlZmluZSBTTUNfUk1JX0RFVl9NRU1fTUFQCQkJU01DNjRfUk1JX0ZJRChVKDB4MjIpKQogCiAvKgogICogRklEOiAweEM0MDAwMTczCisgKgorICogYXJnMCA9PSBSRCBhZGRyZXNzCisgKiBhcmcxID09IG1hcCBhZGRyZXNzCisgKiBhcmcyID09IGxldmVsCisgKgorICogcmV0MSA9PSBBZGRyZXNzIChQQSkgb2YgdGhlIGRldmljZSBtZW1vcnkgZ3JhbnVsZSwgaWYgcmV0MCA9PSBSTUlfU1VDQ0VTUworICogICAgICAgICBPdGhlcndpc2UsIHVuZGVmaW5lZC4KKyAqIHJldDIgPT0gVG9wIG9mIHRoZSBub24tbGl2ZSBhZGRyZXNzIHJlZ2lvbi4gT25seSB2YWxpZAorICogICAgICAgICBpZiByZXQwID09IFJNSV9TVUNDRVNTIG9yIHJldDAgPT0gKFJNSV9FUlJPUl9SVFQsIHgpCiAgKi8KLSNkZWZpbmUgU01DX1JNSV9ERVZfVU5NQVAJCQlTTUM2NF9STUlfRklEKFUoMHgyMykpCisjZGVmaW5lIFNNQ19STUlfREVWX01FTV9VTk1BUAkJCVNNQzY0X1JNSV9GSUQoVSgweDIzKSkKIAogLyoKICAqIEZJRDogMHhDNDAwMDE3NApkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vc3JjL2FybV9ncmFudWxlLmMgYi9wbGF0L2FybS9zcmMvYXJtX2dyYW51bGUuYwppbmRleCA2OWNmMGM3Li5kNWIwOWI2IDEwMDY0NAotLS0gYS9wbGF0L2FybS9zcmMvYXJtX2dyYW51bGUuYworKysgYi9wbGF0L2FybS9zcmMvYXJtX2dyYW51bGUuYwpAQCAtOTgsNyArOTgsNiBAQAogCQl9CiAJfQogCi0JKnR5cGUgPSBERVZfTUVNX01BWDsKIAlyZXR1cm4gVUlOVDY0X01BWDsKIH0KIApkaWZmIC0tZ2l0IGEvcnVudGltZS9jb3JlL2hhbmRsZXIuYyBiL3J1bnRpbWUvY29yZS9oYW5kbGVyLmMKaW5kZXggMDdlMjYxNi4uZmFkMWM2YSAxMDA2NDQKLS0tIGEvcnVudGltZS9jb3JlL2hhbmRsZXIuYworKysgYi9ydW50aW1lL2NvcmUvaGFuZGxlci5jCkBAIC0xNTgsOCArMTU4LDggQEAKIAlIQU5ETEVSKFJFQ19BVVhfQ09VTlQsCQkxLCAxLCBzbWNfcmVjX2F1eF9jb3VudCwJIHRydWUsICB0cnVlKSwKIAlIQU5ETEVSKFJUVF9JTklUX1JJUEFTLAkJMywgMSwgc21jX3J0dF9pbml0X3JpcGFzLAkgZmFsc2UsIHRydWUpLAogCUhBTkRMRVIoUlRUX1NFVF9SSVBBUywJCTQsIDEsIHNtY19ydHRfc2V0X3JpcGFzLAkgZmFsc2UsIHRydWUpLAotCUhBTkRMRVIoREVWX01BUCwJCTAsIDAsIE5VTEwsCQkJIHRydWUsIHRydWUpLAotCUhBTkRMRVIoREVWX1VOTUFQLAkJMCwgMCwgTlVMTCwJCQkgdHJ1ZSwgdHJ1ZSksCisJSEFORExFUihERVZfTUVNX01BUCwJCTQsIDAsIHNtY19kZXZfbWVtX21hcCwJCSBmYWxzZSwgdHJ1ZSksCisJSEFORExFUihERVZfTUVNX1VOTUFQLAkJMywgMiwgc21jX2Rldl9tZW1fdW5tYXAsCSBmYWxzZSwgdHJ1ZSksCiAJSEFORExFUihQREVWX0FCT1JULAkJMCwgMCwgTlVMTCwJCQkgdHJ1ZSwgdHJ1ZSksCiAJSEFORExFUihQREVWX0NPTU1VTklDQVRFLAkyLCAwLCBOVUxMLAkJCSB0cnVlLCB0cnVlKSwKIAlIQU5ETEVSKFBERVZfQ1JFQVRFLAkJMiwgMCwgTlVMTCwJCQkgdHJ1ZSwgdHJ1ZSksCmRpZmYgLS1naXQgYS9ydW50aW1lL2luY2x1ZGUvc21jLWhhbmRsZXIuaCBiL3J1bnRpbWUvaW5jbHVkZS9zbWMtaGFuZGxlci5oCmluZGV4IDU5NjUwNzguLmMyNDA5OWIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvaW5jbHVkZS9zbWMtaGFuZGxlci5oCisrKyBiL3J1bnRpbWUvaW5jbHVkZS9zbWMtaGFuZGxlci5oCkBAIC05Niw0ICs5NiwxNCBAQAogCQkJdW5zaWduZWQgbG9uZyB0b3AsCiAJCQlzdHJ1Y3Qgc21jX3Jlc3VsdCAqcmVzKTsKIAordW5zaWduZWQgbG9uZyBzbWNfZGV2X21lbV9tYXAodW5zaWduZWQgbG9uZyByZF9hZGRyLAorCQkJCXVuc2lnbmVkIGxvbmcgbWFwX2FkZHIsCisJCQkJdW5zaWduZWQgbG9uZyB1bGV2ZWwsCisJCQkJdW5zaWduZWQgbG9uZyBkZXZfbWVtX2FkZHIpOworCit2b2lkIHNtY19kZXZfbWVtX3VubWFwKHVuc2lnbmVkIGxvbmcgcmRfYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbWFwX2FkZHIsCisJCQl1bnNpZ25lZCBsb25nIHVsZXZlbCwKKwkJCXN0cnVjdCBzbWNfcmVzdWx0ICpyZXMpOworCiAjZW5kaWYgLyogU01DX0hBTkRMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvcnVudGltZS9ybWkvcnR0LmMgYi9ydW50aW1lL3JtaS9ydHQuYwppbmRleCA2NGYxMzg4Li41ZDMwMmYzIDEwMDY0NAotLS0gYS9ydW50aW1lL3JtaS9ydHQuYworKysgYi9ydW50aW1lL3JtaS9ydHQuYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGJ1ZmZlci5oPgorI2luY2x1ZGUgPGRldl9ncmFudWxlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxncmFudWxlLmg+CiAjaW5jbHVkZSA8bWVhc3VyZW1lbnQuaD4KQEAgLTIwLDcgKzIxLDggQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogLyoKLSAqIFZhbGlkYXRlIHRoZSBtYXBfYWRkciB2YWx1ZSBwYXNzZWQgdG8gUk1JX1JUVF8qIGFuZCBSTUlfREFUQV8qIGNvbW1hbmRzLgorICogVmFsaWRhdGUgdGhlIG1hcF9hZGRyIHZhbHVlIHBhc3NlZCB0bworICogUk1JX1JUVF8qLCBSTUlfREFUQV8qIGFuZCBSTUlfREVWX01FTV8qIGNvbW1hbmRzLgogICovCiBzdGF0aWMgYm9vbCB2YWxpZGF0ZV9tYXBfYWRkcih1bnNpZ25lZCBsb25nIG1hcF9hZGRyLAogCQkJICAgICAgbG9uZyBsZXZlbCwKQEAgLTQ3LDcgKzQ5LDcgQEAKIH0KIAogLyoKLSAqIE1hcC9Vbm1hcCBjb21tYW5kcyBjYW4gb3BlcmF0ZSB1cCB0byBhIGxldmVsIDIgYmxvY2sgZW50cnkgc28gbWluX2xldmVsIGlzCisgKiBNYXAvVW5tYXAgY29tbWFuZHMgY2FuIG9wZXJhdGUgdXAgdG8gYSBsZXZlbCAxIGJsb2NrIGVudHJ5IHNvIG1pbl9sZXZlbCBpcwogICogdGhlIHNtYWxsZXN0IGJsb2NrIHNpemUuCiAgKi8KIHN0YXRpYyBib29sIHZhbGlkYXRlX3J0dF9tYXBfY21kcyh1bnNpZ25lZCBsb25nIG1hcF9hZGRyLApAQCAtMjYwLDYgKzI2Miw2OSBAQAogCQkgKi8KIAkJYXRvbWljX2dyYW51bGVfZ2V0KHdpLmdfbGx0KTsKIAorCX0gZWxzZSBpZiAoczJ0dGVfaXNfYXNzaWduZWRfZGV2X2VtcHR5KCZzMl9jdHgsIHBhcmVudF9zMnR0ZSwgbGV2ZWwgLSAxTCkpIHsKKwkJdW5zaWduZWQgbG9uZyBibG9ja19wYTsKKworCQkvKgorCQkgKiBXZSBzaG91bGQgb2JzZXJ2ZSBwYXJlbnQgYXNzaWduZWQgczJ0dGUgb25seSB3aGVuCisJCSAqIHdlIGNyZWF0ZSB0YWJsZXMgYWJvdmUgdGhpcyBsZXZlbC4KKwkJICovCisJCWFzc2VydChsZXZlbCA+IFMyVFRfTUlOX0RFVl9CTE9DS19MRVZFTCk7CisKKwkJYmxvY2tfcGEgPSBzMnR0ZV9wYSgmczJfY3R4LCBwYXJlbnRfczJ0dGUsIGxldmVsIC0gMUwpOworCisJCXMydHRfaW5pdF9hc3NpZ25lZF9kZXZfZW1wdHkoJnMyX2N0eCwgczJ0dCwgYmxvY2tfcGEsIGxldmVsKTsKKworCQkvKgorCQkgKiBJbmNyZWFzZSB0aGUgcmVmY291bnQgdG8gbWFyayB0aGUgZ3JhbnVsZSBhcyBpbi11c2UuIHJlZmNvdW50CisJCSAqIGlzIGluY3JlbWVudGVkIGJ5IFMyVFRFU19QRVJfUzJUVCAocmVmIFJUVCB1bmZvbGRpbmcpLgorCQkgKi8KKwkJZ3JhbnVsZV9yZWZjb3VudF9pbmMoZ190YmwsICh1bnNpZ25lZCBzaG9ydClTMlRURVNfUEVSX1MyVFQpOworCisJfSBlbHNlIGlmIChzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZGVzdHJveWVkKCZzMl9jdHgsIHBhcmVudF9zMnR0ZSwgbGV2ZWwgLSAxTCkpIHsKKwkJdW5zaWduZWQgbG9uZyBibG9ja19wYTsKKworCQkvKgorCQkgKiBXZSBzaG91bGQgb2JzZXJ2ZSBwYXJlbnQgYXNzaWduZWQgczJ0dGUgb25seSB3aGVuCisJCSAqIHdlIGNyZWF0ZSB0YWJsZXMgYWJvdmUgdGhpcyBsZXZlbC4KKwkJICovCisJCWFzc2VydChsZXZlbCA+IFMyVFRfTUlOX0RFVl9CTE9DS19MRVZFTCk7CisKKwkJYmxvY2tfcGEgPSBzMnR0ZV9wYSgmczJfY3R4LCBwYXJlbnRfczJ0dGUsIGxldmVsIC0gMUwpOworCisJCXMydHRfaW5pdF9hc3NpZ25lZF9kZXZfZGVzdHJveWVkKCZzMl9jdHgsIHMydHQsIGJsb2NrX3BhLCBsZXZlbCk7CisKKwkJLyoKKwkJICogSW5jcmVhc2UgdGhlIHJlZmNvdW50IHRvIG1hcmsgdGhlIGdyYW51bGUgYXMgaW4tdXNlLiByZWZjb3VudAorCQkgKiBpcyBpbmNyZW1lbnRlZCBieSBTMlRURVNfUEVSX1MyVFQgKHJlZiBSVFQgdW5mb2xkaW5nKS4KKwkJICovCisJCWdyYW51bGVfcmVmY291bnRfaW5jKGdfdGJsLCAodW5zaWduZWQgc2hvcnQpUzJUVEVTX1BFUl9TMlRUKTsKKworCX0gZWxzZSBpZiAoczJ0dGVfaXNfYXNzaWduZWRfZGV2X2RldigmczJfY3R4LCBwYXJlbnRfczJ0dGUsIGxldmVsIC0gMUwpKSB7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tfcGE7CisKKwkJLyoKKwkJICogV2Ugc2hvdWxkIG9ic2VydmUgcGFyZW50IHZhbGlkIHMydHRlIG9ubHkgd2hlbgorCQkgKiB3ZSBjcmVhdGUgdGFibGVzIGFib3ZlIHRoaXMgbGV2ZWwuCisJCSAqLworCQlhc3NlcnQobGV2ZWwgPiBTMlRUX01JTl9ERVZfQkxPQ0tfTEVWRUwpOworCisJCS8qCisJCSAqIEJyZWFrIGJlZm9yZSBtYWtlLiBUaGlzIG1heSBjYXVzZSBzcHVyaW91cyBTMiBhYm9ydHMuCisJCSAqLworCQlzMnR0ZV93cml0ZSgmcGFyZW50X3MydHRbd2kuaW5kZXhdLCAwVUwpOworCQlzMnR0X2ludmFsaWRhdGVfYmxvY2soJnMyX2N0eCwgbWFwX2FkZHIpOworCisJCWJsb2NrX3BhID0gczJ0dGVfcGEoJnMyX2N0eCwgcGFyZW50X3MydHRlLCBsZXZlbCAtIDFMKTsKKworCQlzMnR0X2luaXRfYXNzaWduZWRfZGV2X2RldigmczJfY3R4LCBzMnR0LCBwYXJlbnRfczJ0dGUsIGJsb2NrX3BhLCBsZXZlbCk7CisKKwkJLyoKKwkJICogSW5jcmVhc2UgdGhlIHJlZmNvdW50IHRvIG1hcmsgdGhlIGdyYW51bGUgYXMgaW4tdXNlLiByZWZjb3VudAorCQkgKiBpcyBpbmNyZW1lbnRlZCBieSBTMlRURVNfUEVSX1MyVFQgKHJlZiBSVFQgdW5mb2xkaW5nKS4KKwkJICovCisJCWdyYW51bGVfcmVmY291bnRfaW5jKGdfdGJsLCAodW5zaWduZWQgc2hvcnQpUzJUVEVTX1BFUl9TMlRUKTsKKwogCX0gZWxzZSBpZiAoczJ0dGVfaXNfdGFibGUoJnMyX2N0eCwgcGFyZW50X3MydHRlLCBsZXZlbCAtIDFMKSkgewogCQlyZXQgPSBwYWNrX3JldHVybl9jb2RlKFJNSV9FUlJPUl9SVFQsCiAJCQkJCSh1bnNpZ25lZCBjaGFyKShsZXZlbCAtIDFMKSk7CkBAIC00MzIsNyArNDk3LDIyIEBACiAJCX0gZWxzZSBpZiAoczJ0dF9tYXBzX2Fzc2lnbmVkX2Rlc3Ryb3llZF9ibG9jaygmczJfY3R4LAogCQkJCQkJCSAgICAgIHRhYmxlLCBsZXZlbCkpIHsKIAkJCXBhcmVudF9zMnR0ZSA9IHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXN0cm95ZWQoJnMyX2N0eCwKLQkJCQkJCWJsb2NrX3BhLCBsZXZlbCAtIDFMKTsKKwkJCQkJCQlibG9ja19wYSwgbGV2ZWwgLSAxTCk7CisJCX0gZWxzZSBpZiAoczJ0dF9tYXBzX2Fzc2lnbmVkX2Rldl9lbXB0eV9ibG9jaygmczJfY3R4LAorCQkJCQkJCQl0YWJsZSwgbGV2ZWwpKSB7CisJCQlwYXJlbnRfczJ0dGUgPSBzMnR0ZV9jcmVhdGVfYXNzaWduZWRfZGV2X2VtcHR5KCZzMl9jdHgsCisJCQkJCQkJCQlibG9ja19wYSwKKwkJCQkJCQkJCWxldmVsIC0gMUwpOworCQl9IGVsc2UgaWYgKHMydHRfbWFwc19hc3NpZ25lZF9kZXZfZGVzdHJveWVkX2Jsb2NrKCZzMl9jdHgsCisJCQkJCQkJCSAgdGFibGUsIGxldmVsKSkgeworCQkJcGFyZW50X3MydHRlID0gczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWQoJnMyX2N0eCwKKwkJCQkJCQkJCSAgIGJsb2NrX3BhLAorCQkJCQkJCQkJICAgbGV2ZWwgLSAxTCk7CisJCX0gZWxzZSBpZiAoczJ0dF9tYXBzX2Fzc2lnbmVkX2Rldl9kZXZfYmxvY2soJnMyX2N0eCwgdGFibGUsIGxldmVsKSkgeworCQkJcGFyZW50X3MydHRlID0gczJ0dGVfY3JlYXRlX2Fzc2lnbmVkX2Rldl9kZXYoJnMyX2N0eCwKKwkJCQkJCQkJCXMydHRlLAorCQkJCQkJCQkJbGV2ZWwgLSAxTCk7CisKIAkJLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1peGVkIGVudHJpZXMgdGhhdCBjYW5ub3QgYmUgZm9sZGVkICovCiAJCX0gZWxzZSB7CiAJCQlyZXQgPSBwYWNrX3JldHVybl9jb2RlKFJNSV9FUlJPUl9SVFQsCkBAIC00NTksNyArNTM5LDggQEAKIAlzMnR0ZV93cml0ZSgmcGFyZW50X3MydHRbd2kuaW5kZXhdLCAwVUwpOwogCiAJaWYgKHMydHRlX2lzX2Fzc2lnbmVkX3JhbSgmczJfY3R4LCBwYXJlbnRfczJ0dGUsIGxldmVsIC0gMUwpIHx8Ci0JICAgIHMydHRlX2lzX2Fzc2lnbmVkX25zKCZzMl9jdHgsIHBhcmVudF9zMnR0ZSwgbGV2ZWwgLSAxTCkpIHsKKwkgICAgczJ0dGVfaXNfYXNzaWduZWRfbnMoJnMyX2N0eCwgcGFyZW50X3MydHRlLCBsZXZlbCAtIDFMKSAgfHwKKwkgICAgczJ0dGVfaXNfYXNzaWduZWRfZGV2X2RldigmczJfY3R4LCBwYXJlbnRfczJ0dGUsIGxldmVsIC0gMUwpKSB7CiAJCXMydHRfaW52YWxpZGF0ZV9wYWdlc19pbl9ibG9jaygmczJfY3R4LCBtYXBfYWRkcik7CiAJfSBlbHNlIHsKIAkJczJ0dF9pbnZhbGlkYXRlX2Jsb2NrKCZzMl9jdHgsIG1hcF9hZGRyKTsKQEAgLTgzMiw2ICs5MTMsMTkgQEAKIAkJcmVzLT54WzJdID0gUk1JX0FTU0lHTkVEOwogCQlyZXMtPnhbM10gPSBzMnR0ZV9wYSgmczJfY3R4LCBzMnR0ZSwgd2kubGFzdF9sZXZlbCk7CiAJCXJlcy0+eFs0XSA9ICh1bnNpZ25lZCBsb25nKVJJUEFTX0RFU1RST1lFRDsKKwl9IGVsc2UgaWYgKHMydHRlX2lzX2Fzc2lnbmVkX2Rldl9lbXB0eSgmczJfY3R4LCBzMnR0ZSwgd2kubGFzdF9sZXZlbCkpIHsKKwkJcmVzLT54WzJdID0gUk1JX0FTU0lHTkVEX0RFVjsKKwkJcmVzLT54WzNdID0gczJ0dGVfcGEoJnMyX2N0eCwgczJ0dGUsIHdpLmxhc3RfbGV2ZWwpOworCQlyZXMtPnhbNF0gPSAodW5zaWduZWQgbG9uZylSSVBBU19FTVBUWTsKKwl9IGVsc2UgaWYgKHMydHRlX2lzX2Fzc2lnbmVkX2Rldl9kZXN0cm95ZWQoJnMyX2N0eCwgczJ0dGUsCisJCQkJCQkJd2kubGFzdF9sZXZlbCkpIHsKKwkJcmVzLT54WzJdID0gUk1JX0FTU0lHTkVEX0RFVjsKKwkJcmVzLT54WzNdID0gMFVMOworCQlyZXMtPnhbNF0gPSAodW5zaWduZWQgbG9uZylSSVBBU19ERVNUUk9ZRUQ7CisJfSBlbHNlIGlmIChzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZGV2KCZzMl9jdHgsIHMydHRlLCB3aS5sYXN0X2xldmVsKSkgeworCQlyZXMtPnhbMl0gPSBSTUlfQVNTSUdORURfREVWOworCQlyZXMtPnhbM10gPSBzMnR0ZV9wYSgmczJfY3R4LCBzMnR0ZSwgd2kubGFzdF9sZXZlbCk7CisJCXJlcy0+eFs0XSA9ICh1bnNpZ25lZCBsb25nKVJJUEFTX0RFVjsKIAl9IGVsc2UgaWYgKHMydHRlX2lzX3VuYXNzaWduZWRfbnMoJnMyX2N0eCwgczJ0dGUpKSB7CiAJCXJlcy0+eFsyXSA9IFJNSV9VTkFTU0lHTkVEOwogCQlyZXMtPnhbM10gPSAwVUw7CkBAIC0xNDc0LDMgKzE1NjgsMjE0IEBACiAJZ3JhbnVsZV91bmxvY2soZ19yZWMpOwogCWdyYW51bGVfdW5sb2NrKGdfcmQpOwogfQorCit1bnNpZ25lZCBsb25nIHNtY19kZXZfbWVtX21hcCh1bnNpZ25lZCBsb25nIHJkX2FkZHIsCisJCQkJdW5zaWduZWQgbG9uZyBtYXBfYWRkciwKKwkJCQl1bnNpZ25lZCBsb25nIHVsZXZlbCwKKwkJCQl1bnNpZ25lZCBsb25nIGRldl9tZW1fYWRkcikKK3sKKwlzdHJ1Y3QgZGV2X2dyYW51bGUgKmdfZGV2OworCXN0cnVjdCBncmFudWxlICpnX3JkOworCXN0cnVjdCByZCAqcmQ7CisJc3RydWN0IHMydHRfd2FsayB3aTsKKwlzdHJ1Y3QgczJ0dF9jb250ZXh0IHMyX2N0eDsKKwl1bnNpZ25lZCBsb25nIHMydHRlLCAqczJ0dCwgbnVtX2dyYW51bGVzOworCWxvbmcgbGV2ZWwgPSAobG9uZyl1bGV2ZWw7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJX191bnVzZWQgZW51bSBkZXZfY29oX3R5cGUgdHlwZTsKKworCS8qIERldl9NZW1fTWFwL1VubWFwIGNvbW1hbmRzIGNhbiBvcGVyYXRlIHVwIHRvIGEgbGV2ZWwgMiBibG9jayBlbnRyeSAqLworCWlmICgobGV2ZWwgPCBTMlRUX01JTl9ERVZfQkxPQ0tfTEVWRUwpIHx8IChsZXZlbCA+IFMyVFRfUEFHRV9MRVZFTCkpIHsKKwkJcmV0dXJuIFJNSV9FUlJPUl9JTlBVVDsKKwl9CisKKwkvKgorCSAqIFRoZSBjb2RlIGJlbG93IGFzc3VtZXMgdGhhdCAiZXh0ZXJuYWwiIGdyYW51bGVzIGFyZSBhbHdheXMKKwkgKiBsb2NrZWQgYmVmb3JlICJleHRlcm5hbCIgZGV2X2dyYW51bGVzLCBoZW5jZSwgUkQgR1JBTlVMRSBpcyBsb2NrZWQKKwkgKiBiZWZvcmUgREVMRUdBVEVEIERFVl9HUkFOVUxFLgorCSAqCisJICogVGhlIGFsdGVybmF0aXZlIHNjaGVtZSBpcyB0aGF0IGFsbCBleHRlcm5hbCBncmFudWxlcyBhbmQgZGV2aWNlCisJICogZ3JhbnVsZXMgYXJlIGxvY2tlZCB0b2dldGhlciBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgcGh5c2ljYWwKKwkgKiBhZGRyZXNzZXMuIEZvciB0aGF0IHNjaGVtZSwgaG93ZXZlciwgd2UgbmVlZCBwcmltaXRpdmVzIHNpbWlsYXIgdG8KKwkgKiAnZmluZF9sb2NrX3R3b19ncmFudWxlcycgdGhhdCB3b3VsZCB3b3JrIHdpdGggZGlmZmVyZW50IG9iamVjdAorCSAqIHR5cGVzIChzdHJ1Y3QgZ3JhbnVsZSBhbmQgc3RydWN0IGRldl9ncmFudWxlKS4KKwkgKi8KKworCWdfcmQgPSBmaW5kX2xvY2tfZ3JhbnVsZShyZF9hZGRyLCBHUkFOVUxFX1NUQVRFX1JEKTsKKwlpZiAoZ19yZCA9PSBOVUxMKSB7CisJCXJldHVybiBSTUlfRVJST1JfSU5QVVQ7CisJfQorCisJaWYgKGxldmVsID09IFMyVFRfUEFHRV9MRVZFTCkgeworCQludW1fZ3JhbnVsZXMgPSAxVUw7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KGxldmVsID09IChTMlRUX1BBR0VfTEVWRUwgLSAxTCkpOworCQludW1fZ3JhbnVsZXMgPSBTMlRURVNfUEVSX1MyVFQ7CisJfQorCisJZ19kZXYgPSBmaW5kX2xvY2tfZGV2X2dyYW51bGVzKGRldl9tZW1fYWRkciwKKwkJCQkJREVWX0dSQU5VTEVfU1RBVEVfREVMRUdBVEVELAorCQkJCQludW1fZ3JhbnVsZXMsCisJCQkJCSZ0eXBlKTsKKwlpZiAoZ19kZXYgPT0gTlVMTCkgeworCQlncmFudWxlX3VubG9jayhnX3JkKTsKKwkJcmV0dXJuIFJNSV9FUlJPUl9JTlBVVDsKKwl9CisKKwlyZCA9IGJ1ZmZlcl9ncmFudWxlX21hcChnX3JkLCBTTE9UX1JEKTsKKwlhc3NlcnQocmQgIT0gTlVMTCk7CisKKwlpZiAoIWFkZHJfaW5fcGFyKHJkLCBtYXBfYWRkcikgfHwKKwkgICAgIXZhbGlkYXRlX21hcF9hZGRyKG1hcF9hZGRyLCBsZXZlbCwgcmQpKSB7CisJCWJ1ZmZlcl91bm1hcChyZCk7CisJCWdyYW51bGVfdW5sb2NrKGdfcmQpOworCQlyZXQgPSBSTUlfRVJST1JfSU5QVVQ7CisJCWdvdG8gb3V0X3VubG9ja19ncmFudWxlczsKKwl9CisKKwlzMl9jdHggPSByZC0+czJfY3R4OworCWJ1ZmZlcl91bm1hcChyZCk7CisJZ3JhbnVsZV9sb2NrKHMyX2N0eC5nX3J0dCwgR1JBTlVMRV9TVEFURV9SVFQpOworCWdyYW51bGVfdW5sb2NrKGdfcmQpOworCisJczJ0dF93YWxrX2xvY2tfdW5sb2NrKCZzMl9jdHgsIG1hcF9hZGRyLCBsZXZlbCwgJndpKTsKKwlpZiAod2kubGFzdF9sZXZlbCAhPSBsZXZlbCkgeworCQlyZXQgPSBwYWNrX3JldHVybl9jb2RlKFJNSV9FUlJPUl9SVFQsCisJCQkJCSh1bnNpZ25lZCBjaGFyKXdpLmxhc3RfbGV2ZWwpOworCQlnb3RvIG91dF91bmxvY2tfbGxfdGFibGU7CisJfQorCisJczJ0dCA9IGJ1ZmZlcl9ncmFudWxlX21hcCh3aS5nX2xsdCwgU0xPVF9SVFQpOworCWFzc2VydChzMnR0ICE9IE5VTEwpOworCisJczJ0dGUgPSBzMnR0ZV9yZWFkKCZzMnR0W3dpLmluZGV4XSk7CisKKwlpZiAoIXMydHRlX2lzX3VuYXNzaWduZWQoJnMyX2N0eCwgczJ0dGUpKSB7CisJCXJldCA9IHBhY2tfcmV0dXJuX2NvZGUoUk1JX0VSUk9SX1JUVCwgKHVuc2lnbmVkIGNoYXIpbGV2ZWwpOworCQlnb3RvIG91dF91bm1hcF9sbF90YWJsZTsKKwl9CisKKwlzMnR0ZSA9IHMydHRlX2NyZWF0ZV9hc3NpZ25lZF9kZXZfdW5jaGFuZ2VkKCZzMl9jdHgsIHMydHRlLAorCQkJCQkJICAgIGRldl9tZW1fYWRkciwgbGV2ZWwpOworCXMydHRlX3dyaXRlKCZzMnR0W3dpLmluZGV4XSwgczJ0dGUpOworCWF0b21pY19ncmFudWxlX2dldCh3aS5nX2xsdCk7CisKKwlyZXQgPSBSTUlfU1VDQ0VTUzsKKworb3V0X3VubWFwX2xsX3RhYmxlOgorCWJ1ZmZlcl91bm1hcChzMnR0KTsKK291dF91bmxvY2tfbGxfdGFibGU6CisJZ3JhbnVsZV91bmxvY2sod2kuZ19sbHQpOworb3V0X3VubG9ja19ncmFudWxlczoKKwl3aGlsZSAobnVtX2dyYW51bGVzICE9IDBVTCkgeworCQlpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7CisJCQlkZXZfZ3JhbnVsZV91bmxvY2tfdHJhbnNpdGlvbigmZ19kZXZbLS1udW1fZ3JhbnVsZXNdLAorCQkJCQkJCURFVl9HUkFOVUxFX1NUQVRFX01BUFBFRCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZ3JhbnVsZV91bmxvY2soJmdfZGV2Wy0tbnVtX2dyYW51bGVzXSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzbWNfZGV2X21lbV91bm1hcCh1bnNpZ25lZCBsb25nIHJkX2FkZHIsCisJCQl1bnNpZ25lZCBsb25nIG1hcF9hZGRyLAorCQkJdW5zaWduZWQgbG9uZyB1bGV2ZWwsCisJCQlzdHJ1Y3Qgc21jX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCBncmFudWxlICpnX3JkOworCXN0cnVjdCByZCAqcmQ7CisJc3RydWN0IHMydHRfd2FsayB3aTsKKwlzdHJ1Y3QgczJ0dF9jb250ZXh0IHMyX2N0eDsKKwl1bnNpZ25lZCBsb25nIGRldl9tZW1fYWRkciwgZGV2X2FkZHIsIHMydHRlLCAqczJ0dCwgbnVtX2dyYW51bGVzOworCWxvbmcgbGV2ZWwgPSAobG9uZyl1bGV2ZWw7CisJX191bnVzZWQgZW51bSBkZXZfY29oX3R5cGUgdHlwZTsKKworCS8qIERldl9NZW1fTWFwL1VubWFwIGNvbW1hbmRzIGNhbiBvcGVyYXRlIHVwIHRvIGEgbGV2ZWwgMiBibG9jayBlbnRyeSAqLworCWlmICgobGV2ZWwgPCBTMlRUX01JTl9ERVZfQkxPQ0tfTEVWRUwpIHx8IChsZXZlbCA+IFMyVFRfUEFHRV9MRVZFTCkpIHsKKwkJcmVzLT54WzBdID0gUk1JX0VSUk9SX0lOUFVUOworCQlyZXMtPnhbMl0gPSAwVUw7CisJCXJldHVybjsKKwl9CisKKwlnX3JkID0gZmluZF9sb2NrX2dyYW51bGUocmRfYWRkciwgR1JBTlVMRV9TVEFURV9SRCk7CisJaWYgKGdfcmQgPT0gTlVMTCkgeworCQlyZXMtPnhbMF0gPSBSTUlfRVJST1JfSU5QVVQ7CisJCXJlcy0+eFsyXSA9IDBVTDsKKwkJcmV0dXJuOworCX0KKworCXJkID0gYnVmZmVyX2dyYW51bGVfbWFwKGdfcmQsIFNMT1RfUkQpOworCWFzc2VydChyZCAhPSBOVUxMKTsKKworCWlmICghYWRkcl9pbl9wYXIocmQsIG1hcF9hZGRyKSB8fAorCSAgICAhdmFsaWRhdGVfbWFwX2FkZHIobWFwX2FkZHIsIGxldmVsLCByZCkpIHsKKwkJYnVmZmVyX3VubWFwKHJkKTsKKwkJZ3JhbnVsZV91bmxvY2soZ19yZCk7CisJCXJlcy0+eFswXSA9IFJNSV9FUlJPUl9JTlBVVDsKKwkJcmVzLT54WzJdID0gMFVMOworCQlyZXR1cm47CisJfQorCisJczJfY3R4ID0gcmQtPnMyX2N0eDsKKwlidWZmZXJfdW5tYXAocmQpOworCisJZ3JhbnVsZV9sb2NrKHMyX2N0eC5nX3J0dCwgR1JBTlVMRV9TVEFURV9SVFQpOworCWdyYW51bGVfdW5sb2NrKGdfcmQpOworCisJczJ0dF93YWxrX2xvY2tfdW5sb2NrKCZzMl9jdHgsIG1hcF9hZGRyLCBsZXZlbCwgJndpKTsKKwlzMnR0ID0gYnVmZmVyX2dyYW51bGVfbWFwKHdpLmdfbGx0LCBTTE9UX1JUVCk7CisJYXNzZXJ0KHMydHQgIT0gTlVMTCk7CisKKwlpZiAod2kubGFzdF9sZXZlbCAhPSBsZXZlbCkgeworCQlyZXMtPnhbMF0gPSBwYWNrX3JldHVybl9jb2RlKFJNSV9FUlJPUl9SVFQsCisJCQkJCQkodW5zaWduZWQgY2hhcil3aS5sYXN0X2xldmVsKTsKKwkJZ290byBvdXRfdW5tYXBfbGxfdGFibGU7CisJfQorCisJczJ0dGUgPSBzMnR0ZV9yZWFkKCZzMnR0W3dpLmluZGV4XSk7CisKKwlpZiAoczJ0dGVfaXNfYXNzaWduZWRfZGV2X2RldigmczJfY3R4LCBzMnR0ZSwgbGV2ZWwpKSB7CisJCWRldl9tZW1fYWRkciA9IHMydHRlX3BhKCZzMl9jdHgsIHMydHRlLCBsZXZlbCk7CisJCXMydHRlID0gczJ0dGVfY3JlYXRlX3VuYXNzaWduZWRfZGVzdHJveWVkKCZzMl9jdHgpOworCQlzMnR0ZV93cml0ZSgmczJ0dFt3aS5pbmRleF0sIHMydHRlKTsKKwkJaWYgKGxldmVsID09IFMyVFRfUEFHRV9MRVZFTCkgeworCQkJczJ0dF9pbnZhbGlkYXRlX3BhZ2UoJnMyX2N0eCwgbWFwX2FkZHIpOworCQl9IGVsc2UgeworCQkJczJ0dF9pbnZhbGlkYXRlX2Jsb2NrKCZzMl9jdHgsIG1hcF9hZGRyKTsKKwkJfQorCX0gZWxzZSBpZiAoczJ0dGVfaXNfYXNzaWduZWRfZGV2X2VtcHR5KCZzMl9jdHgsIHMydHRlLCBsZXZlbCkpIHsKKwkJZGV2X21lbV9hZGRyID0gczJ0dGVfcGEoJnMyX2N0eCwgczJ0dGUsIGxldmVsKTsKKwkJczJ0dGUgPSBzMnR0ZV9jcmVhdGVfdW5hc3NpZ25lZF9lbXB0eSgmczJfY3R4KTsKKwkJczJ0dGVfd3JpdGUoJnMydHRbd2kuaW5kZXhdLCBzMnR0ZSk7CisJfSBlbHNlIGlmIChzMnR0ZV9pc19hc3NpZ25lZF9kZXZfZGVzdHJveWVkKCZzMl9jdHgsIHMydHRlLCBsZXZlbCkpIHsKKwkJZGV2X21lbV9hZGRyID0gczJ0dGVfcGEoJnMyX2N0eCwgczJ0dGUsIGxldmVsKTsKKwkJczJ0dGUgPSBzMnR0ZV9jcmVhdGVfdW5hc3NpZ25lZF9kZXN0cm95ZWQoJnMyX2N0eCk7CisJCXMydHRlX3dyaXRlKCZzMnR0W3dpLmluZGV4XSwgczJ0dGUpOworCX0gZWxzZSB7CisJCXJlcy0+eFswXSA9IHBhY2tfcmV0dXJuX2NvZGUoUk1JX0VSUk9SX1JUVCwKKwkJCQkJCSh1bnNpZ25lZCBjaGFyKWxldmVsKTsKKwkJZ290byBvdXRfdW5tYXBfbGxfdGFibGU7CisJfQorCisJYXRvbWljX2dyYW51bGVfcHV0KHdpLmdfbGx0KTsKKworCW51bV9ncmFudWxlcyA9IChsZXZlbCA9PSBTMlRUX1BBR0VfTEVWRUwpID8gMVVMIDogUzJUVEVTX1BFUl9TMlRUOworCWRldl9hZGRyID0gZGV2X21lbV9hZGRyOworCisJZm9yICh1bnNpZ25lZCBsb25nIGkgPSAwVUw7IGkgPCBudW1fZ3JhbnVsZXM7IGkrKykgeworCQlzdHJ1Y3QgZGV2X2dyYW51bGUgKmdfZGV2OworCisJCWdfZGV2ID0gZmluZF9sb2NrX2Rldl9ncmFudWxlKGRldl9hZGRyLCBERVZfR1JBTlVMRV9TVEFURV9NQVBQRUQsICZ0eXBlKTsKKwkJYXNzZXJ0KGdfZGV2ICE9IE5VTEwpOworCQlkZXZfZ3JhbnVsZV91bmxvY2tfdHJhbnNpdGlvbihnX2RldiwgREVWX0dSQU5VTEVfU1RBVEVfREVMRUdBVEVEKTsKKwkJZGV2X2FkZHIgKz0gR1JBTlVMRV9TSVpFOworCX0KKworCXJlcy0+eFswXSA9IFJNSV9TVUNDRVNTOworCXJlcy0+eFsxXSA9IGRldl9tZW1fYWRkcjsKK291dF91bm1hcF9sbF90YWJsZToKKwlyZXMtPnhbMl0gPSBzMnR0X3NraXBfbm9uX2xpdmVfZW50cmllcygmczJfY3R4LCBtYXBfYWRkciwgczJ0dCwgJndpKTsKKwlidWZmZXJfdW5tYXAoczJ0dCk7CisJZ3JhbnVsZV91bmxvY2sod2kuZ19sbHQpOworfQo=